SelectLangDialog.vue 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. <template>
  2. <Dialog ref="dialog" v-model="dialogVisible">
  3. <template #header>
  4. <div class="row items-center">
  5. <div style="font-size: 110%">
  6. Выбрать языки
  7. </div>
  8. </div>
  9. </template>
  10. <div ref="box" class="column q-mt-xs overflow-auto no-wrap" style="width: 370px; padding: 0px 10px 10px 10px;">
  11. <div v-show="langList.length" class="checkbox-tick-all">
  12. <div class="row items-center">
  13. <q-option-group
  14. v-model="ticked"
  15. :options="optionsPre"
  16. type="checkbox"
  17. inline
  18. />
  19. <div class="col" />
  20. <div v-show="lang != langDefault" class="clickable" @click="setAsDefaults">
  21. Установить по умолчанию
  22. </div>
  23. </div>
  24. <q-checkbox v-model="tickAll" label="Выбрать/снять все" toggle-order="ft" @update:model-value="makeTickAll" />
  25. </div>
  26. <q-option-group
  27. v-model="ticked"
  28. :options="options"
  29. type="checkbox"
  30. inline
  31. >
  32. <template #label="opt">
  33. <div class="row items-center" style="width: 35px">
  34. <span>{{ opt.label }}</span>
  35. </div>
  36. </template>
  37. </q-option-group>
  38. </div>
  39. <template #footer>
  40. <q-btn class="q-px-md q-ml-sm" color="primary" dense no-caps @click="okClick">
  41. OK
  42. </q-btn>
  43. </template>
  44. </Dialog>
  45. </template>
  46. <script>
  47. //-----------------------------------------------------------------------------
  48. import vueComponent from '../../vueComponent.js';
  49. import Dialog from '../../share/Dialog.vue';
  50. const componentOptions = {
  51. components: {
  52. Dialog
  53. },
  54. watch: {
  55. modelValue(newValue) {
  56. this.dialogVisible = newValue;
  57. if (newValue)
  58. this.init();//no await
  59. },
  60. dialogVisible(newValue) {
  61. this.$emit('update:modelValue', newValue);
  62. },
  63. lang() {
  64. this.updateTicked();
  65. },
  66. ticked() {
  67. this.checkAllTicked();
  68. this.updateLang();
  69. },
  70. }
  71. };
  72. class SelectLangDialog {
  73. _options = componentOptions;
  74. _props = {
  75. modelValue: Boolean,
  76. lang: {type: String, value: ''},
  77. langDefault: {type: String, value: ''},
  78. langList: Array,
  79. };
  80. dialogVisible = false;
  81. ticked = [];
  82. tickAll = false;
  83. created() {
  84. this.commit = this.$store.commit;
  85. }
  86. mounted() {
  87. this.updateTicked();
  88. }
  89. async init() {
  90. //await this.$refs.dialog.waitShown();
  91. }
  92. get options() {
  93. const result = [];
  94. for (const lang of this.langList) {
  95. result.push({label: lang, value: lang});
  96. }
  97. return result;
  98. }
  99. get optionsPre() {
  100. const result = [];
  101. for (const lang of this.langList) {
  102. if (['ru', 'en'].includes(lang)) {
  103. result.push({label: lang, value: lang});
  104. }
  105. }
  106. return result.reverse();
  107. }
  108. makeTickAll() {
  109. if (this.tickAll) {
  110. const newTicked = [];
  111. for (const lang of this.langList) {
  112. newTicked.push(lang);
  113. }
  114. this.ticked = newTicked;
  115. } else {
  116. this.ticked = [];
  117. this.tickAll = false;
  118. }
  119. }
  120. checkAllTicked() {
  121. const ticked = new Set(this.ticked);
  122. let newTickAll = !!(this.langList.length);
  123. for (const lang of this.langList) {
  124. if (!ticked.has(lang)) {
  125. newTickAll = false;
  126. break;
  127. }
  128. }
  129. if (this.ticked.length && !newTickAll) {
  130. this.tickAll = undefined;
  131. } else {
  132. this.tickAll = newTickAll;
  133. }
  134. }
  135. updateTicked() {
  136. this.ticked = this.lang.split(',').filter(s => s);
  137. }
  138. updateLang() {
  139. this.$emit('update:lang', this.ticked.join(','));
  140. }
  141. setAsDefaults() {
  142. this.commit('setSettings', {langDefault: this.lang});
  143. }
  144. okClick() {
  145. this.dialogVisible = false;
  146. }
  147. }
  148. export default vueComponent(SelectLangDialog);
  149. //-----------------------------------------------------------------------------
  150. </script>
  151. <style scoped>
  152. .checkbox-tick-all {
  153. border-bottom: 1px solid #bbbbbb;
  154. margin-bottom: 7px;
  155. padding: 5px 5px 2px 0px;
  156. }
  157. .clickable {
  158. color: blue;
  159. cursor: pointer;
  160. }
  161. </style>