show.blade.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. @extends('admin.partial.template-full')
  2. @section('section')
  3. <div class="title d-flex justify-content-between align-items-center">
  4. <div>
  5. <h3 class="font-weight-bold d-inline-block">Discover Category</h3>
  6. <p class="lead mb-0">ID: #{{$category->id}}</p>
  7. </div>
  8. <div>
  9. <a class="btn btn-outline-primary btn-sm py-1" href="{{route('admin.discover')}}">Back</a>
  10. </div>
  11. </div>
  12. <hr>
  13. <form class="px-md-5 cc-form" method="post">
  14. <div class="form-group row">
  15. <label for="categoryName" class="col-sm-2 col-form-label font-weight-bold">Name</label>
  16. <div class="col-sm-10">
  17. <input type="text" class="form-control" id="categoryName" placeholder="Nature" autocomplete="off" value="{{$category->name}}">
  18. <p class="form-text small font-weight-bold text-muted">Slug: /discover/c/{{$category->slug}}</p>
  19. </div>
  20. </div>
  21. <div class="form-group row">
  22. <label for="categoryName" class="col-sm-2 col-form-label font-weight-bold">Media ID</label>
  23. <div class="col-sm-10">
  24. <input type="text" class="form-control" id="categoryMedia" placeholder="1" autocomplete="off" value="{{$category->media_id}}">
  25. <p class="form-text small font-weight-bold text-muted">Media ID is used for category thumbnail image</p>
  26. </div>
  27. </div>
  28. <div class="form-group row">
  29. <label for="categoryActive" class="col-sm-2 col-form-label font-weight-bold">Active</label>
  30. <div class="col-sm-10">
  31. <div class="custom-control custom-switch pt-2">
  32. <input type="checkbox" class="custom-control-input" id="categoryActive" {{$category->active ?'checked=""':''}}>
  33. <label class="custom-control-label" for="categoryActive"></label>
  34. </div>
  35. </div>
  36. </div>
  37. <div class="form-group row">
  38. <label class="col-sm-2 col-form-label font-weight-bold">Rules</label>
  39. <div class="col-sm-10">
  40. <div class="custom-control custom-switch pt-2">
  41. <input type="checkbox" class="custom-control-input" id="categoryNsfw" {{!$category->no_nsfw ?'checked=""':''}}>
  42. <label class="custom-control-label" for="categoryNsfw">Allow NSFW</label>
  43. </div>
  44. <div class="custom-control custom-switch pt-2">
  45. <input type="checkbox" class="custom-control-input" id="categoryType" {{$category->photos_only ?'checked=""':''}}>
  46. <label class="custom-control-label" for="categoryType">Photos Only</label>
  47. </div>
  48. <div class="custom-control custom-switch pt-2">
  49. <input type="checkbox" class="custom-control-input" id="categoryLocal" {{$category->local_only ?'checked=""':''}}>
  50. <label class="custom-control-label" for="categoryType">Local Posts Only</label>
  51. </div>
  52. </div>
  53. </div>
  54. <hr>
  55. <div class="form-group row">
  56. <label for="categoryName" class="col-sm-2 col-form-label font-weight-bold">Hashtags</label>
  57. <div class="col-sm-10">
  58. <input type="text" class="form-control" id="categoryTags" data-role="tagsinput" value="{{$category->hashtags()->pluck('slug')->implode(',')}}">
  59. </div>
  60. </div>
  61. <div class="form-group">
  62. <div class="text-right">
  63. <button type="submit" class="btn btn-primary btn-sm py-1 font-weight-bold">Update</button>
  64. </div>
  65. </div>
  66. </form>
  67. @endsection
  68. @push('scripts')
  69. <script type="text/javascript">
  70. (function($){"use strict";var defaultOptions={tagClass:function(item){return'badge badge-info'},focusClass:'focus',itemValue:function(item){return item?item.toString():item},itemText:function(item){return this.itemValue(item)},itemTitle:function(item){return null},freeInput:!0,addOnBlur:!0,maxTags:undefined,maxChars:undefined,confirmKeys:[13,44],delimiter:',',delimiterRegex:null,cancelConfirmKeysOnEmpty:!1,onTagExists:function(item,$tag){$tag.addClass('sr-only')},trimValue:!1,allowDuplicates:!1,triggerChange:!0};function TagsInput(element,options){this.isInit=!0;this.itemsArray=[];this.$element=$(element);this.$element.addClass('sr-only');this.isSelect=(element.tagName==='SELECT');this.multiple=(this.isSelect&&element.hasAttribute('multiple'));this.objectItems=options&&options.itemValue;this.placeholderText=element.hasAttribute('placeholder')?this.$element.attr('placeholder'):'';this.inputSize=Math.max(1,this.placeholderText.length);this.$container=$('<div class="bootstrap-tagsinput"></div>');this.$input=$('<input type="text" placeholder="'+this.placeholderText+'"/>').appendTo(this.$container);this.$element.before(this.$container);this.build(options);this.isInit=!1}
  71. TagsInput.prototype={constructor:TagsInput,add:function(item,dontPushVal,options){var self=this;if(self.options.maxTags&&self.itemsArray.length>=self.options.maxTags)
  72. return;if(item!==!1&&!item)
  73. return;if(typeof item==="string"&&self.options.trimValue){item=$.trim(item)}
  74. if(typeof item==="object"&&!self.objectItems)
  75. throw("Can't add objects when itemValue option is not set");if(item.toString().match(/^\s*$/))
  76. return;if(self.isSelect&&!self.multiple&&self.itemsArray.length>0)
  77. self.remove(self.itemsArray[0]);if(typeof item==="string"&&this.$element[0].tagName==='INPUT'){var delimiter=(self.options.delimiterRegex)?self.options.delimiterRegex:self.options.delimiter;var items=item.split(delimiter);if(items.length>1){for(var i=0;i<items.length;i++){this.add(items[i],!0)}
  78. if(!dontPushVal)
  79. self.pushVal(self.options.triggerChange);return}}
  80. var itemValue=self.options.itemValue(item),itemText=self.options.itemText(item),tagClass=self.options.tagClass(item),itemTitle=self.options.itemTitle(item);var existing=$.grep(self.itemsArray,function(item){return self.options.itemValue(item)===itemValue})[0];if(existing&&!self.options.allowDuplicates){if(self.options.onTagExists){var $existingTag=$(".badge",self.$container).filter(function(){return $(this).data("item")===existing});self.options.onTagExists(item,$existingTag)}
  81. return}
  82. if(self.items().toString().length+item.length+1>self.options.maxInputLength)
  83. return;var beforeItemAddEvent=$.Event('beforeItemAdd',{item:item,cancel:!1,options:options});self.$element.trigger(beforeItemAddEvent);if(beforeItemAddEvent.cancel)
  84. return;self.itemsArray.push(item);var $tag=$('<span class="badge '+htmlEncode(tagClass)+(itemTitle!==null?('" title="'+itemTitle):'')+'">'+htmlEncode(itemText)+'<span data-role="remove"></span></span>');$tag.data('item',item);self.findInputWrapper().before($tag);$tag.after(' ');var optionExists=($('option[value="'+encodeURIComponent(itemValue)+'"]',self.$element).length||$('option[value="'+htmlEncode(itemValue)+'"]',self.$element).length);if(self.isSelect&&!optionExists){var $option=$('<option selected>'+htmlEncode(itemText)+'</option>');$option.data('item',item);$option.attr('value',itemValue);self.$element.append($option)}
  85. if(!dontPushVal)
  86. self.pushVal(self.options.triggerChange);if(self.options.maxTags===self.itemsArray.length||self.items().toString().length===self.options.maxInputLength)
  87. self.$container.addClass('bootstrap-tagsinput-max');if($('.typeahead, .twitter-typeahead',self.$container).length){self.$input.typeahead('val','')}
  88. if(this.isInit){self.$element.trigger($.Event('itemAddedOnInit',{item:item,options:options}))}else{self.$element.trigger($.Event('itemAdded',{item:item,options:options}))}},remove:function(item,dontPushVal,options){var self=this;if(self.objectItems){if(typeof item==="object")
  89. item=$.grep(self.itemsArray,function(other){return self.options.itemValue(other)==self.options.itemValue(item)});else item=$.grep(self.itemsArray,function(other){return self.options.itemValue(other)==item});item=item[item.length-1]}
  90. if(item){var beforeItemRemoveEvent=$.Event('beforeItemRemove',{item:item,cancel:!1,options:options});self.$element.trigger(beforeItemRemoveEvent);if(beforeItemRemoveEvent.cancel)
  91. return;$('.badge',self.$container).filter(function(){return $(this).data('item')===item}).remove();$('option',self.$element).filter(function(){return $(this).data('item')===item}).remove();if($.inArray(item,self.itemsArray)!==-1)
  92. self.itemsArray.splice($.inArray(item,self.itemsArray),1)}
  93. if(!dontPushVal)
  94. self.pushVal(self.options.triggerChange);if(self.options.maxTags>self.itemsArray.length)
  95. self.$container.removeClass('bootstrap-tagsinput-max');self.$element.trigger($.Event('itemRemoved',{item:item,options:options}))},removeAll:function(){var self=this;$('.badge',self.$container).remove();$('option',self.$element).remove();while(self.itemsArray.length>0)
  96. self.itemsArray.pop();self.pushVal(self.options.triggerChange)},refresh:function(){var self=this;$('.badge',self.$container).each(function(){var $tag=$(this),item=$tag.data('item'),itemValue=self.options.itemValue(item),itemText=self.options.itemText(item),tagClass=self.options.tagClass(item);$tag.attr('class',null);$tag.addClass('badge '+htmlEncode(tagClass));$tag.contents().filter(function(){return this.nodeType==3})[0].nodeValue=htmlEncode(itemText);if(self.isSelect){var option=$('option',self.$element).filter(function(){return $(this).data('item')===item});option.attr('value',itemValue)}})},items:function(){return this.itemsArray},pushVal:function(){var self=this,val=$.map(self.items(),function(item){return self.options.itemValue(item).toString()});self.$element.val(val.join(self.options.delimiter));if(self.options.triggerChange)
  97. self.$element.trigger('change')},build:function(options){var self=this;self.options=$.extend({},defaultOptions,options);if(self.objectItems)
  98. self.options.freeInput=!1;makeOptionItemFunction(self.options,'itemValue');makeOptionItemFunction(self.options,'itemText');makeOptionFunction(self.options,'tagClass');if(self.options.typeahead){var typeahead=self.options.typeahead||{};makeOptionFunction(typeahead,'source');self.$input.typeahead($.extend({},typeahead,{source:function(query,process){function processItems(items){var texts=[];for(var i=0;i<items.length;i++){var text=self.options.itemText(items[i]);map[text]=items[i];texts.push(text)}
  99. process(texts)}
  100. this.map={};var map=this.map,data=typeahead.source(query);if($.isFunction(data.success)){data.success(processItems)}else if($.isFunction(data.then)){data.then(processItems)}else{$.when(data).then(processItems)}},updater:function(text){self.add(this.map[text]);return this.map[text]},matcher:function(text){return(text.toLowerCase().indexOf(this.query.trim().toLowerCase())!==-1)},sorter:function(texts){return texts.sort()},highlighter:function(text){var regex=new RegExp('('+this.query+')','gi');return text.replace(regex,"<strong>$1</strong>")}}))}
  101. if(self.options.typeaheadjs){var typeaheadjs=self.options.typeaheadjs;if(!$.isArray(typeaheadjs)){typeaheadjs=[null,typeaheadjs]}
  102. $.fn.typeahead.apply(self.$input,typeaheadjs).on('typeahead:selected',$.proxy(function(obj,datum,name){var index=0;typeaheadjs.some(function(dataset,_index){if(dataset.name===name){index=_index;return!0}
  103. return!1});if(typeaheadjs[index].valueKey){self.add(datum[typeaheadjs[index].valueKey])}else{self.add(datum)}
  104. self.$input.typeahead('val','')},self))}
  105. self.$container.on('click',$.proxy(function(event){if(!self.$element.attr('disabled')){self.$input.removeAttr('disabled')}
  106. self.$input.focus()},self));if(self.options.addOnBlur&&self.options.freeInput){self.$input.on('focusout',$.proxy(function(event){if($('.typeahead, .twitter-typeahead',self.$container).length===0){self.add(self.$input.val());self.$input.val('')}},self))}
  107. self.$container.on({focusin:function(){self.$container.addClass(self.options.focusClass)},focusout:function(){self.$container.removeClass(self.options.focusClass)},});self.$container.on('keydown','input',$.proxy(function(event){var $input=$(event.target),$inputWrapper=self.findInputWrapper();if(self.$element.attr('disabled')){self.$input.attr('disabled','disabled');return}
  108. switch(event.which){case 8:if(doGetCaretPosition($input[0])===0){var prev=$inputWrapper.prev();if(prev.length){self.remove(prev.data('item'))}}
  109. break;case 46:if(doGetCaretPosition($input[0])===0){var next=$inputWrapper.next();if(next.length){self.remove(next.data('item'))}}
  110. break;case 37:var $prevTag=$inputWrapper.prev();if($input.val().length===0&&$prevTag[0]){$prevTag.before($inputWrapper);$input.focus()}
  111. break;case 39:var $nextTag=$inputWrapper.next();if($input.val().length===0&&$nextTag[0]){$nextTag.after($inputWrapper);$input.focus()}
  112. break;default:}
  113. var textLength=$input.val().length,wordSpace=Math.ceil(textLength/5),size=textLength+wordSpace+1;$input.attr('size',Math.max(this.inputSize,size))},self));self.$container.on('keypress','input',$.proxy(function(event){var $input=$(event.target);if(self.$element.attr('disabled')){self.$input.attr('disabled','disabled');return}
  114. var text=$input.val(),maxLengthReached=self.options.maxChars&&text.length>=self.options.maxChars;if(self.options.freeInput&&(keyCombinationInList(event,self.options.confirmKeys)||maxLengthReached)){if(text.length!==0){self.add(maxLengthReached?text.substr(0,self.options.maxChars):text);$input.val('')}
  115. if(self.options.cancelConfirmKeysOnEmpty===!1){event.preventDefault()}}
  116. var textLength=$input.val().length,wordSpace=Math.ceil(textLength/5),size=textLength+wordSpace+1;$input.attr('size',Math.max(this.inputSize,size))},self));self.$container.on('click','[data-role=remove]',$.proxy(function(event){if(self.$element.attr('disabled')){return}
  117. self.remove($(event.target).closest('.badge').data('item'))},self));if(self.options.itemValue===defaultOptions.itemValue){if(self.$element[0].tagName==='INPUT'){self.add(self.$element.val())}else{$('option',self.$element).each(function(){self.add($(this).attr('value'),!0)})}}},destroy:function(){var self=this;self.$container.off('keypress','input');self.$container.off('click','[role=remove]');self.$container.remove();self.$element.removeData('tagsinput');self.$element.show()},focus:function(){this.$input.focus()},input:function(){return this.$input},findInputWrapper:function(){var elt=this.$input[0],container=this.$container[0];while(elt&&elt.parentNode!==container)
  118. elt=elt.parentNode;return $(elt)}};$.fn.tagsinput=function(arg1,arg2,arg3){var results=[];this.each(function(){var tagsinput=$(this).data('tagsinput');if(!tagsinput){tagsinput=new TagsInput(this,arg1);$(this).data('tagsinput',tagsinput);results.push(tagsinput);if(this.tagName==='SELECT'){$('option',$(this)).attr('selected','selected')}
  119. $(this).val($(this).val())}else if(!arg1&&!arg2){results.push(tagsinput)}else if(tagsinput[arg1]!==undefined){if(tagsinput[arg1].length===3&&arg3!==undefined){var retVal=tagsinput[arg1](arg2,null,arg3)}else{var retVal=tagsinput[arg1](arg2)}
  120. if(retVal!==undefined)
  121. results.push(retVal)}});if(typeof arg1=='string'){return results.length>1?results:results[0]}else{return results}};$.fn.tagsinput.Constructor=TagsInput;function makeOptionItemFunction(options,key){if(typeof options[key]!=='function'){var propertyName=options[key];options[key]=function(item){return item[propertyName]}}}
  122. function makeOptionFunction(options,key){if(typeof options[key]!=='function'){var value=options[key];options[key]=function(){return value}}}
  123. var htmlEncodeContainer=$('<div />');function htmlEncode(value){if(value){return htmlEncodeContainer.text(value).html()}else{return''}}
  124. function doGetCaretPosition(oField){var iCaretPos=0;if(document.selection){oField.focus();var oSel=document.selection.createRange();oSel.moveStart('character',-oField.value.length);iCaretPos=oSel.text.length}else if(oField.selectionStart||oField.selectionStart=='0'){iCaretPos=oField.selectionStart}
  125. return(iCaretPos)}
  126. function keyCombinationInList(keyPressEvent,lookupList){var found=!1;$.each(lookupList,function(index,keyCombination){if(typeof(keyCombination)==='number'&&keyPressEvent.which===keyCombination){found=!0;return!1}
  127. if(keyPressEvent.which===keyCombination.which){var alt=!keyCombination.hasOwnProperty('altKey')||keyPressEvent.altKey===keyCombination.altKey,shift=!keyCombination.hasOwnProperty('shiftKey')||keyPressEvent.shiftKey===keyCombination.shiftKey,ctrl=!keyCombination.hasOwnProperty('ctrlKey')||keyPressEvent.ctrlKey===keyCombination.ctrlKey;if(alt&&shift&&ctrl){found=!0;return!1}}});return found}
  128. $(function(){$("input[data-role=tagsinput], select[multiple][data-role=tagsinput]").tagsinput()})})(window.jQuery)
  129. </script>
  130. <script type="text/javascript">
  131. $(document).ready(function() {
  132. $('#categoryTags').tagsinput();
  133. $('#categoryTags').on('beforeItemAdd', function(event) {
  134. let tag = event.item;
  135. axios.post('{{route('admin.discover.create-hashtag')}}', {
  136. 'category_id': {{$category->id}},
  137. 'hashtag': tag,
  138. 'action': 'create'
  139. }).catch(function(err) {
  140. event.cancel = true;
  141. });
  142. });
  143. $('#categoryTags').on('beforeItemRemove', function(event) {
  144. let tag = event.item;
  145. axios.post('{{route('admin.discover.create-hashtag')}}', {
  146. 'category_id': {{$category->id}},
  147. 'hashtag': tag,
  148. 'action': 'delete'
  149. }).catch(function(err) {
  150. event.cancel = true;
  151. });
  152. });
  153. $('.cc-form').on('submit', function(e) {
  154. e.preventDefault();
  155. let data = {
  156. 'name': document.getElementById('categoryName').value,
  157. 'media': document.getElementById('categoryMedia').value,
  158. 'active': document.getElementById('categoryActive').checked,
  159. 'hashtags': document.getElementById('categoryTags').value
  160. };
  161. axios.post('{{request()->url()}}', data)
  162. .then(res => {
  163. window.location.href = '{{request()->url()}}';
  164. });
  165. })
  166. });
  167. </script>
  168. @endpush
  169. @push('styles')
  170. <style type="text/css">
  171. /*
  172. * bootstrap-tagsinput v0.8.0
  173. *
  174. */
  175. .bootstrap-tagsinput {
  176. background-color: #fff;
  177. border: 1px solid #ccc;
  178. box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
  179. display: inline-block;
  180. padding: 4px 6px;
  181. color: #555;
  182. vertical-align: middle;
  183. border-radius: 4px;
  184. width: 100%;
  185. line-height: 22px;
  186. cursor: text;
  187. }
  188. .bootstrap-tagsinput input {
  189. border: none;
  190. box-shadow: none;
  191. outline: none;
  192. background-color: transparent;
  193. padding: 0 6px;
  194. margin: 0;
  195. width: auto;
  196. max-width: inherit;
  197. }
  198. .bootstrap-tagsinput.form-control input::-moz-placeholder {
  199. color: #777;
  200. opacity: 1;
  201. }
  202. .bootstrap-tagsinput.form-control input:-ms-input-placeholder {
  203. color: #777;
  204. }
  205. .bootstrap-tagsinput.form-control input::-webkit-input-placeholder {
  206. color: #777;
  207. }
  208. .bootstrap-tagsinput input:focus {
  209. border: none;
  210. box-shadow: none;
  211. }
  212. .bootstrap-tagsinput .badge {
  213. margin-right: 2px;
  214. color: white;
  215. background-color:#0275d8;
  216. padding:5px 8px;border-radius:3px;
  217. border:1px solid #01649e
  218. }
  219. .bootstrap-tagsinput .badge [data-role="remove"] {
  220. margin-left: 8px;
  221. cursor: pointer;
  222. }
  223. .bootstrap-tagsinput .badge [data-role="remove"]:after {
  224. content: "×";
  225. padding: 0px 4px;
  226. background-color:rgba(0, 0, 0, 0.1);
  227. border-radius:50%;
  228. font-size:13px
  229. }
  230. .bootstrap-tagsinput .badge [data-role="remove"]:hover:after {
  231. background-color:rgba(0, 0, 0, 0.62);
  232. }
  233. .bootstrap-tagsinput .badge [data-role="remove"]:hover:active {
  234. box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
  235. }
  236. </style>
  237. @endpush