vue-rule-script.html 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. <div id="app">
  2. <div class="app-wrapper" :class="{'is-preview':preview}">
  3. <div class="editor" v-if="!preview && !legacy" v-cloak>
  4. <div class="controls">
  5. <vue-button class="primary is-large" @click="clickPreview" :icon="icons.view">Preview</vue-button>
  6. </div>
  7. <div class="details">
  8. <div class="label-group">
  9. <label class="label" for="">
  10. <span>What is the community's name?</span>
  11. <input type="text" v-model="rule.name" @change="rule.ruleID = slugify(rule.name)">
  12. </label>
  13. <label class="label">
  14. <span>Icon:</span>
  15. <div class="dropdown">
  16. <label v-for="(icon, iconName, idx) in ruleIcons" :key="idx"
  17. :class="{ selected: rule.icon == icon }">
  18. <input type="radio" id="" :selected="rule.icon == icon" :value="icon" v-model="rule.icon">
  19. <div><img :src="icon" :alt="iconName"></div>
  20. </label>
  21. <label class="default">
  22. <div><img :src="icons.blank"></div>
  23. </label>
  24. </div>
  25. </label>
  26. </div>
  27. <label class="label" for="">
  28. <span>Summarize its structure:</span>
  29. <textarea v-model="rule.summary"></textarea>
  30. </label>
  31. </div>
  32. <div class="rule__modules" :class="{ target: holding }">
  33. <label class="label" for="" v-if="rule.name"><icon :icon="rule.icon"></icon>[[rule.name]]</label>
  34. <div
  35. class="modules__dropzone modules__grid"
  36. :data-module-id="rule.ruleID"
  37. .module="rule"
  38. @drop.prevent="dropOnRule" @dragenter.prevent @dragover.prevent
  39. >
  40. <div v-if="rule.modules.length < 1">Drag rules from the library below here, or create your own!</div>
  41. <module
  42. v-for="module in rule.modules"
  43. :key="module"
  44. @click="handleClickEditModule"
  45. :module="module"
  46. draggable="true"
  47. @dragstart="rearrangeModule"
  48. ></module>
  49. </div>
  50. </div>
  51. <div class="module-editor__wrapper">
  52. <div class="module-editor">
  53. <module
  54. class="module-editor__label"
  55. hide-submodules
  56. :module="editor.module"
  57. draggable="false"
  58. v-if="editor.module.name"
  59. ></module>
  60. <div class="module-editor__right">
  61. <vue-button class="success" :icon="icons.plus" @click="clickAddModule" v-if="!moduleContains(editor.module) && editor.module && editor.module.name">Add</vue-button>
  62. <vue-button class="danger" :icon="icons.minus" @click="clickRemoveModule" v-if="moduleContains(editor.module)">Remove</vue-button>
  63. </div>
  64. <div class="module-editor__fields">
  65. <div class="label-group">
  66. <label class="label">
  67. <span>Module name:</span>
  68. <input class="input-stack" type="text" v-model="editor.module.name" @change="editor.module.moduleID = slugify(editor.module.name)">
  69. </label>
  70. <label class="label">
  71. <span>Icon:</span>
  72. <div class="dropdown">
  73. <label v-for="(icon, iconName, idx) in moduleIcons" :key="idx" :class="{ selected: editor.module.icon == icon }">
  74. <input type="radio" id="" :selected="editor.module.icon == icon" :value="icon" v-model="editor.module.icon">
  75. <div><img :src="icon" :alt="iconName"></div>
  76. </label>
  77. <label class="default"><div><img :src="icons.blank"></div></label>
  78. </div>
  79. </label>
  80. </div>
  81. <label class="label">
  82. <span>Module Summary:</span>
  83. <textarea v-model="editor.module.summary"></textarea>
  84. </label>
  85. <label v-if="editor.module.config != 'b'"
  86. class="label">
  87. <span>Config: {{ editor.module.config }}</span>
  88. <table>
  89. <tr v-for="(key, value) in editor.module.config">
  90. <td>{{ key }}</td>
  91. <td><input v-model="{{ value }}" /></td>
  92. </tr>
  93. </table>
  94. </label>
  95. <!-- <div class="label-group">
  96. <label class="label">
  97. <span>Module ID:</span>
  98. <input type="text" v-model="editor.module.moduleID">
  99. </label>
  100. <label class="label">
  101. <span>Type:</span>
  102. <input type="text" v-model="editor.module.type">
  103. </label>
  104. </div>
  105. <div class="modules__grid" v-if="editor.module.modules">
  106. <module
  107. v-for="(module, idx) in editor.module.modules"
  108. :key="idx"
  109. @click="handleClickEditModule"
  110. :module="module"
  111. ></module>
  112. </div>
  113. <label for="">
  114. <vue-button @click="saveEditor">Save</vue-button>
  115. </label>
  116. <label for="" v-if="customModules.includes(editor.module)">
  117. <vue-button @click="deleteModule(editor.module)">Delete</vue-button>
  118. </label> -->
  119. </div>
  120. </div>
  121. <div class="label-group is-mobile">
  122. <div class="module" @click="newCustomModule">
  123. Create Custom Module
  124. <span class="plus"><img :src="icons.plus" alt="Add"></span>
  125. </div>
  126. <div class="module-editor__empty">
  127. <small>Or click a module to start editing it.</small>
  128. </div>
  129. </div>
  130. </div>
  131. <div class="modules">
  132. <div class="tabs">
  133. <div class="tab__control" v-for="(type, name) in moduleTypes" :key="name" @click="moduleLibrary = name" :class="{ active: moduleLibrary == name}">
  134. <img :src="type.icon" :alt="name"><span class="tab__control-name">[[ name ]]</span>
  135. </div>
  136. </div>
  137. <div class="tab__pane">
  138. <div class="modules__type" v-for="(type, name) in moduleTypes" :key="name" v-show="moduleLibrary == name" :test="name">
  139. <p>[[ type.question ]]</p>
  140. <div class="modules__grid">
  141. <module
  142. v-for="(module, index) in getModulesByType(name)"
  143. :key="index"
  144. :module="module"
  145. @click="handleClickCopyModule"
  146. has-grain
  147. draggable="true"
  148. @dragstart="startDragModule"
  149. ></module>
  150. </div>
  151. </div>
  152. </div>
  153. </div>
  154. <div class="creator">
  155. <label class="label" for="">
  156. <span><img src="/assets/tabler_icons/pencil.svg"> Created By</span>
  157. <input type="text" v-model="rule.creator.name" placeholder="your name">
  158. </label>
  159. <label class="label" for="">
  160. <span><img src="/assets/tabler_icons/globe.svg"> Creator URL</span>
  161. <input type="text" v-model="rule.creator.url" placeholder="https://yourwebsite.org">
  162. </label>
  163. </div>
  164. </div>
  165. <div class="rule" v-show="preview" v-if="!legacy">
  166. <div class="controls">
  167. <vue-button class="primary is-large" @click="clickPreview" :icon="icons.edit" v-if="!view">Edit</vue-button>
  168. </div>
  169. <h1><icon :icon="rule.icon" v-if="rule.icon"></icon> [[rule.name]]</h1>
  170. <p>[[rule.summary]]</p>
  171. <div class="modules__grid" :data-module-id="rule.ruleID" .module="rule">
  172. <module-display
  173. v-for="module in rule.modules"
  174. :key="module"
  175. :module="module"
  176. ></module-display>
  177. </div>
  178. <ul class="module-list">
  179. <module-list v-for="(module, index) in rule.modules" :key="index" :module="module" v-if="rule.modules"></module-list>
  180. </ul>
  181. <div class="rule__creator" v-if="rule.creator.name">
  182. Created By
  183. <img src="/assets/tabler_icons/pencil.svg">
  184. <span v-if="rule.creator.url"><a :href="rule.creator.url">[[rule.creator.name]]</a></span>
  185. <span v-else>[[rule.creator.name]]</span>
  186. </div>
  187. </div>
  188. <div class="rule legacy" v-if="legacy && preview">
  189. <h1>[[rule.name]]</h1>
  190. <p>[[rule.summary]]</p>
  191. <div id="rule-builder" class="rulebuilder">
  192. <div id="module-input" class="rulebuilder_input modules__grid" v-html="rule.modules">
  193. </div>
  194. <div id="builder-field" class="rulebuilder_list">
  195. </div>
  196. </div>
  197. <div v-html="rule.rulewriter"></div>
  198. <div class="lineage" v-if="rule.lineage" v-html="rule.lineage"></div>
  199. <div class="rule__creator" v-if="rule.creatorName">
  200. Created By
  201. <img src="/assets/tabler_icons/pencil.svg">
  202. <span v-if="rule.creatorUrl"><a :href="rule.creatorUrl">[[rule.creatorName]]</a></span>
  203. <span v-else>[[rule.creatorName]]</span>
  204. </div>
  205. </div>
  206. <div class="btn-group" v-if="!legacy && !view">
  207. <vue-button class="primary is-large" @click="handleClickPublish" :icon="icons.publish" :loading="publishing">Publish</vue-button>
  208. <vue-button class="is-large" @click="handleClickDownload" :icon="icons.download">Download</vue-button>
  209. <vue-button class="is-large" @click="handleClickExport" :icon="icons.export">Export</vue-button>
  210. <vue-button class="is-large" @click="handleClickImport" :icon="icons.upload">Import <div class="btn-cover">coming soon!</div></vue-button>
  211. </div>
  212. <div class="btn-group" v-if="view && !legacy">
  213. <vue-button class="primary is-large" @click="clickPreview" :icon="icons.fork">Fork &amp; Edit</vue-button>
  214. <vue-button class="is-large" @click="handleClickDownload" :icon="icons.download">Download</vue-button>
  215. </div>
  216. </div>
  217. <div id="rule-export" v-show="false" v-if="!legacy">
  218. <h1>[[rule.name]]</h1>
  219. <p>[[rule.summary]]</p>
  220. <ul class="module-list">
  221. <module-list v-for="(module, index) in rule.modules" :key="index" :module="module" v-if="rule.modules" hide-icon></module-list>
  222. </ul>
  223. <hr>
  224. <h2>Created By</h2>
  225. <p v-if="rule.creator.url"><a :href="rule.creator.url">[[rule.creator.name]]</a></p>
  226. <p v-else>[[rule.creator.name]]</p>
  227. </div>
  228. </div>
  229. <script src="/assets/js/vue.global.js"></script>
  230. <script src="/assets/DragDropTouch.js"></script>
  231. <script src="https://unpkg.com/stein-js-client"></script>
  232. <script src="https://cdnjs.cloudflare.com/ajax/libs/js-yaml/4.1.0/js-yaml.min.js" defer
  233. integrity="sha512-CSBhVREyzHAjAFfBlIBakjoRUKp5h7VSweP0InR/pAJyptH7peuhCsqAI/snV+TwZmXZqoUklpXp6R6wMnYf5Q=="
  234. crossorigin="anonymous" referrerpolicy="no-referrer"></script>
  235. <script src="https://unpkg.com/turndown/dist/turndown.js" defer></script>
  236. <script>
  237. let global = {};
  238. global.modules = [
  239. {% assign modules_array = site.modules | sort: "type" %}
  240. {% for module in modules_array %}
  241. {
  242. name: "{{ module.title | escape }}",
  243. url: "{{ site.baseurl }}{{ module.permalink }}",
  244. moduleID: "{{ module.slug }}",
  245. icon: "{{ site.data.module_types[module.type].icon | default: 'null'}}",
  246. summary: "{{ module.summary }}",
  247. type: "{{ module.type }}",
  248. content: `{{ module.content | markdownify }}`,
  249. readonly: true,
  250. modules: []
  251. } {% unless forloop.last %}, {% endunless %}
  252. {% endfor %}
  253. ];
  254. // global.url = "{{ site.url }}{{ site.baseurl }}";
  255. global.url = "https://communityrule.info";
  256. global.rule = {{ page.rule | jsonify }};
  257. </script>
  258. <script src="/assets/js/vue.rules.js"></script>