mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-11-03 07:20:07 -05:00 
			
		
		
		
	Enforce trailing comma in JS on multiline (#30002)
To keep blame info accurate and to avoid [changes like this](https://github.com/go-gitea/gitea/pull/29977/files#diff-c3422631a14edbe1e508c4b22f0c718db318be08a6e889427802f9b6165d88d6R359), it's good to always have a trailing comma, so let's enforce it in JS. This rule is completely automatically fixable with `make lint-js-fix` and that's what I did here.
This commit is contained in:
		@@ -119,7 +119,7 @@ rules:
 | 
				
			|||||||
  "@stylistic/js/arrow-spacing": [2, {before: true, after: true}]
 | 
					  "@stylistic/js/arrow-spacing": [2, {before: true, after: true}]
 | 
				
			||||||
  "@stylistic/js/block-spacing": [0]
 | 
					  "@stylistic/js/block-spacing": [0]
 | 
				
			||||||
  "@stylistic/js/brace-style": [2, 1tbs, {allowSingleLine: true}]
 | 
					  "@stylistic/js/brace-style": [2, 1tbs, {allowSingleLine: true}]
 | 
				
			||||||
  "@stylistic/js/comma-dangle": [2, only-multiline]
 | 
					  "@stylistic/js/comma-dangle": [2, always-multiline]
 | 
				
			||||||
  "@stylistic/js/comma-spacing": [2, {before: false, after: true}]
 | 
					  "@stylistic/js/comma-spacing": [2, {before: false, after: true}]
 | 
				
			||||||
  "@stylistic/js/comma-style": [2, last]
 | 
					  "@stylistic/js/comma-style": [2, last]
 | 
				
			||||||
  "@stylistic/js/computed-property-spacing": [2, never]
 | 
					  "@stylistic/js/computed-property-spacing": [2, never]
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,7 +20,7 @@ export default {
 | 
				
			|||||||
     * Maximum time expect() should wait for the condition to be met.
 | 
					     * Maximum time expect() should wait for the condition to be met.
 | 
				
			||||||
     * For example in `await expect(locator).toHaveText();`
 | 
					     * For example in `await expect(locator).toHaveText();`
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    timeout: 2000
 | 
					    timeout: 2000,
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* Fail the build on CI if you accidentally left test.only in the source code. */
 | 
					  /* Fail the build on CI if you accidentally left test.only in the source code. */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,7 +20,7 @@ async function generate(svg, path, {size, bg}) {
 | 
				
			|||||||
        'removeDimensions',
 | 
					        'removeDimensions',
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
          name: 'addAttributesToSVGElement',
 | 
					          name: 'addAttributesToSVGElement',
 | 
				
			||||||
          params: {attributes: [{width: size}, {height: size}]}
 | 
					          params: {attributes: [{width: size}, {height: size}]},
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
      ],
 | 
					      ],
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -39,8 +39,8 @@ async function processFile(file, {prefix, fullName} = {}) {
 | 
				
			|||||||
          attributes: [
 | 
					          attributes: [
 | 
				
			||||||
            {'xmlns': 'http://www.w3.org/2000/svg'},
 | 
					            {'xmlns': 'http://www.w3.org/2000/svg'},
 | 
				
			||||||
            {'width': '16'}, {'height': '16'}, {'aria-hidden': 'true'},
 | 
					            {'width': '16'}, {'height': '16'}, {'aria-hidden': 'true'},
 | 
				
			||||||
          ]
 | 
					          ],
 | 
				
			||||||
        }
 | 
					        },
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,20 +10,20 @@ export default {
 | 
				
			|||||||
  props: {
 | 
					  props: {
 | 
				
			||||||
    status: {
 | 
					    status: {
 | 
				
			||||||
      type: String,
 | 
					      type: String,
 | 
				
			||||||
      required: true
 | 
					      required: true,
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    size: {
 | 
					    size: {
 | 
				
			||||||
      type: Number,
 | 
					      type: Number,
 | 
				
			||||||
      default: 16
 | 
					      default: 16,
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    className: {
 | 
					    className: {
 | 
				
			||||||
      type: String,
 | 
					      type: String,
 | 
				
			||||||
      default: ''
 | 
					      default: '',
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    localeStatus: {
 | 
					    localeStatus: {
 | 
				
			||||||
      type: String,
 | 
					      type: String,
 | 
				
			||||||
      default: ''
 | 
					      default: '',
 | 
				
			||||||
    }
 | 
					    },
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,7 +11,7 @@ export default {
 | 
				
			|||||||
    locale: {
 | 
					    locale: {
 | 
				
			||||||
      type: Object,
 | 
					      type: Object,
 | 
				
			||||||
      default: () => {},
 | 
					      default: () => {},
 | 
				
			||||||
    }
 | 
					    },
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  data: () => ({
 | 
					  data: () => ({
 | 
				
			||||||
    colorRange: [
 | 
					    colorRange: [
 | 
				
			||||||
@@ -49,7 +49,7 @@ export default {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
      const newSearch = params.toString();
 | 
					      const newSearch = params.toString();
 | 
				
			||||||
      window.location.search = newSearch.length ? `?${newSearch}` : '';
 | 
					      window.location.search = newSearch.length ? `?${newSearch}` : '';
 | 
				
			||||||
    }
 | 
					    },
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -69,7 +69,7 @@ export default {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        return {name: label.name, color: `#${label.color}`, textColor};
 | 
					        return {name: label.name, color: `#${label.color}`, textColor};
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
    }
 | 
					    },
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  mounted() {
 | 
					  mounted() {
 | 
				
			||||||
    this.$refs.root.addEventListener('ce-load-context-popup', (e) => {
 | 
					    this.$refs.root.addEventListener('ce-load-context-popup', (e) => {
 | 
				
			||||||
@@ -97,8 +97,8 @@ export default {
 | 
				
			|||||||
      } finally {
 | 
					      } finally {
 | 
				
			||||||
        this.loading = false;
 | 
					        this.loading = false;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    },
 | 
				
			||||||
  }
 | 
					  },
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
<template>
 | 
					<template>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -253,7 +253,7 @@ const sfc = {
 | 
				
			|||||||
            ...webSearchRepo.repository,
 | 
					            ...webSearchRepo.repository,
 | 
				
			||||||
            latest_commit_status_state: webSearchRepo.latest_commit_status.State,
 | 
					            latest_commit_status_state: webSearchRepo.latest_commit_status.State,
 | 
				
			||||||
            locale_latest_commit_status_state: webSearchRepo.locale_latest_commit_status,
 | 
					            locale_latest_commit_status_state: webSearchRepo.locale_latest_commit_status,
 | 
				
			||||||
            latest_commit_status_state_link: webSearchRepo.latest_commit_status.TargetURL
 | 
					            latest_commit_status_state_link: webSearchRepo.latest_commit_status.TargetURL,
 | 
				
			||||||
          };
 | 
					          };
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
        const count = response.headers.get('X-Total-Count');
 | 
					        const count = response.headers.get('X-Total-Count');
 | 
				
			||||||
@@ -325,7 +325,7 @@ const sfc = {
 | 
				
			|||||||
      if (this.activeIndex === -1 || this.activeIndex > this.repos.length - 1) {
 | 
					      if (this.activeIndex === -1 || this.activeIndex > this.repos.length - 1) {
 | 
				
			||||||
        this.activeIndex = 0;
 | 
					        this.activeIndex = 0;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    },
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,7 +14,7 @@ export default {
 | 
				
			|||||||
      },
 | 
					      },
 | 
				
			||||||
      commits: [],
 | 
					      commits: [],
 | 
				
			||||||
      hoverActivated: false,
 | 
					      hoverActivated: false,
 | 
				
			||||||
      lastReviewCommitSha: null
 | 
					      lastReviewCommitSha: null,
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  computed: {
 | 
					  computed: {
 | 
				
			||||||
@@ -29,7 +29,7 @@ export default {
 | 
				
			|||||||
    },
 | 
					    },
 | 
				
			||||||
    issueLink() {
 | 
					    issueLink() {
 | 
				
			||||||
      return this.$el.parentNode.getAttribute('data-issuelink');
 | 
					      return this.$el.parentNode.getAttribute('data-issuelink');
 | 
				
			||||||
    }
 | 
					    },
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  mounted() {
 | 
					  mounted() {
 | 
				
			||||||
    document.body.addEventListener('click', this.onBodyClick);
 | 
					    document.body.addEventListener('click', this.onBodyClick);
 | 
				
			||||||
@@ -185,7 +185,7 @@ export default {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
  }
 | 
					  },
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
<template>
 | 
					<template>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -31,7 +31,7 @@ export default {
 | 
				
			|||||||
    },
 | 
					    },
 | 
				
			||||||
    loadMoreData() {
 | 
					    loadMoreData() {
 | 
				
			||||||
      loadMoreFiles(this.store.linkLoadMore);
 | 
					      loadMoreFiles(this.store.linkLoadMore);
 | 
				
			||||||
    }
 | 
					    },
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -30,7 +30,7 @@ export default {
 | 
				
			|||||||
          let newParent = {
 | 
					          let newParent = {
 | 
				
			||||||
            name: split,
 | 
					            name: split,
 | 
				
			||||||
            children: [],
 | 
					            children: [],
 | 
				
			||||||
            isFile
 | 
					            isFile,
 | 
				
			||||||
          };
 | 
					          };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          if (isFile === true) {
 | 
					          if (isFile === true) {
 | 
				
			||||||
@@ -40,7 +40,7 @@ export default {
 | 
				
			|||||||
          if (parent) {
 | 
					          if (parent) {
 | 
				
			||||||
            // check if the folder already exists
 | 
					            // check if the folder already exists
 | 
				
			||||||
            const existingFolder = parent.children.find(
 | 
					            const existingFolder = parent.children.find(
 | 
				
			||||||
              (x) => x.name === split
 | 
					              (x) => x.name === split,
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            if (existingFolder) {
 | 
					            if (existingFolder) {
 | 
				
			||||||
              newParent = existingFolder;
 | 
					              newParent = existingFolder;
 | 
				
			||||||
@@ -74,7 +74,7 @@ export default {
 | 
				
			|||||||
      // reduce the depth of our tree.
 | 
					      // reduce the depth of our tree.
 | 
				
			||||||
      mergeChildIfOnlyOneDir(result);
 | 
					      mergeChildIfOnlyOneDir(result);
 | 
				
			||||||
      return result;
 | 
					      return result;
 | 
				
			||||||
    }
 | 
					    },
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  mounted() {
 | 
					  mounted() {
 | 
				
			||||||
    // Default to true if unset
 | 
					    // Default to true if unset
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,7 +7,7 @@ export default {
 | 
				
			|||||||
  props: {
 | 
					  props: {
 | 
				
			||||||
    item: {
 | 
					    item: {
 | 
				
			||||||
      type: Object,
 | 
					      type: Object,
 | 
				
			||||||
      required: true
 | 
					      required: true,
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  data: () => ({
 | 
					  data: () => ({
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -43,7 +43,7 @@ export default {
 | 
				
			|||||||
      for (const elem of document.querySelectorAll('[data-pull-merge-style]')) {
 | 
					      for (const elem of document.querySelectorAll('[data-pull-merge-style]')) {
 | 
				
			||||||
        toggleElem(elem, elem.getAttribute('data-pull-merge-style') === val);
 | 
					        toggleElem(elem, elem.getAttribute('data-pull-merge-style') === val);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    },
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  created() {
 | 
					  created() {
 | 
				
			||||||
    this.mergeStyleAllowedCount = this.mergeForm.mergeStyles.reduce((v, msd) => v + (msd.allowed ? 1 : 0), 0);
 | 
					    this.mergeStyleAllowedCount = this.mergeForm.mergeStyles.reduce((v, msd) => v + (msd.allowed ? 1 : 0), 0);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -66,7 +66,7 @@ const sfc = {
 | 
				
			|||||||
            name: '',
 | 
					            name: '',
 | 
				
			||||||
            link: '',
 | 
					            link: '',
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
        }
 | 
					        },
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      currentJob: {
 | 
					      currentJob: {
 | 
				
			||||||
        title: '',
 | 
					        title: '',
 | 
				
			||||||
@@ -311,7 +311,7 @@ const sfc = {
 | 
				
			|||||||
      const logLine = this.$refs.steps.querySelector(selectedLogStep);
 | 
					      const logLine = this.$refs.steps.querySelector(selectedLogStep);
 | 
				
			||||||
      if (!logLine) return;
 | 
					      if (!logLine) return;
 | 
				
			||||||
      logLine.querySelector('.line-num').click();
 | 
					      logLine.querySelector('.line-num').click();
 | 
				
			||||||
    }
 | 
					    },
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -352,7 +352,7 @@ export function initRepositoryActionView() {
 | 
				
			|||||||
        skipped: el.getAttribute('data-locale-status-skipped'),
 | 
					        skipped: el.getAttribute('data-locale-status-skipped'),
 | 
				
			||||||
        blocked: el.getAttribute('data-locale-status-blocked'),
 | 
					        blocked: el.getAttribute('data-locale-status-blocked'),
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
    }
 | 
					    },
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
  view.mount(el);
 | 
					  view.mount(el);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -47,7 +47,7 @@ const sfc = {
 | 
				
			|||||||
    this.colors.barColor = refStyle.backgroundColor;
 | 
					    this.colors.barColor = refStyle.backgroundColor;
 | 
				
			||||||
    this.colors.textColor = refStyle.color;
 | 
					    this.colors.textColor = refStyle.color;
 | 
				
			||||||
    this.colors.textAltColor = refAltStyle.color;
 | 
					    this.colors.textAltColor = refAltStyle.color;
 | 
				
			||||||
  }
 | 
					  },
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function initRepoActivityTopAuthorsChart() {
 | 
					export function initRepoActivityTopAuthorsChart() {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -36,7 +36,7 @@ const sfc = {
 | 
				
			|||||||
    },
 | 
					    },
 | 
				
			||||||
    shouldCreateTag() {
 | 
					    shouldCreateTag() {
 | 
				
			||||||
      return this.mode === 'tags';
 | 
					      return this.mode === 'tags';
 | 
				
			||||||
    }
 | 
					    },
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  watch: {
 | 
					  watch: {
 | 
				
			||||||
@@ -45,7 +45,7 @@ const sfc = {
 | 
				
			|||||||
        this.focusSearchField();
 | 
					        this.focusSearchField();
 | 
				
			||||||
        this.fetchBranchesOrTags();
 | 
					        this.fetchBranchesOrTags();
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    },
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  beforeMount() {
 | 
					  beforeMount() {
 | 
				
			||||||
@@ -209,7 +209,7 @@ const sfc = {
 | 
				
			|||||||
        this.isLoading = false;
 | 
					        this.isLoading = false;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
  }
 | 
					  },
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function initRepoBranchTagSelector(selector) {
 | 
					export function initRepoBranchTagSelector(selector) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -39,7 +39,7 @@ export default {
 | 
				
			|||||||
  props: {
 | 
					  props: {
 | 
				
			||||||
    locale: {
 | 
					    locale: {
 | 
				
			||||||
      type: Object,
 | 
					      type: Object,
 | 
				
			||||||
      required: true
 | 
					      required: true,
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  data: () => ({
 | 
					  data: () => ({
 | 
				
			||||||
@@ -128,12 +128,12 @@ export default {
 | 
				
			|||||||
            },
 | 
					            },
 | 
				
			||||||
            ticks: {
 | 
					            ticks: {
 | 
				
			||||||
              maxRotation: 0,
 | 
					              maxRotation: 0,
 | 
				
			||||||
              maxTicksLimit: 12
 | 
					              maxTicksLimit: 12,
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          y: {
 | 
					          y: {
 | 
				
			||||||
            ticks: {
 | 
					            ticks: {
 | 
				
			||||||
              maxTicksLimit: 6
 | 
					              maxTicksLimit: 6,
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -34,7 +34,7 @@ const customEventListener = {
 | 
				
			|||||||
      chart.resetZoom();
 | 
					      chart.resetZoom();
 | 
				
			||||||
      opts.instance.updateOtherCharts(args.event, true);
 | 
					      opts.instance.updateOtherCharts(args.event, true);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  },
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Chart.defaults.color = chartJsColors.text;
 | 
					Chart.defaults.color = chartJsColors.text;
 | 
				
			||||||
@@ -82,7 +82,7 @@ export default {
 | 
				
			|||||||
        this.xAxisMax = this.xAxisEnd;
 | 
					        this.xAxisMax = this.xAxisEnd;
 | 
				
			||||||
        this.type = val;
 | 
					        this.type = val;
 | 
				
			||||||
        this.sortContributors();
 | 
					        this.sortContributors();
 | 
				
			||||||
      }
 | 
					      },
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  methods: {
 | 
					  methods: {
 | 
				
			||||||
@@ -175,7 +175,7 @@ export default {
 | 
				
			|||||||
      // Normally, chartjs handles this automatically, but it will resize the graph when you
 | 
					      // Normally, chartjs handles this automatically, but it will resize the graph when you
 | 
				
			||||||
      // zoom, pan etc. I think resizing the graph makes it harder to compare things visually.
 | 
					      // zoom, pan etc. I think resizing the graph makes it harder to compare things visually.
 | 
				
			||||||
      const maxValue = Math.max(
 | 
					      const maxValue = Math.max(
 | 
				
			||||||
        ...this.totalStats.weeks.map((o) => o[this.type])
 | 
					        ...this.totalStats.weeks.map((o) => o[this.type]),
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
      const [coefficient, exp] = maxValue.toExponential().split('e').map(Number);
 | 
					      const [coefficient, exp] = maxValue.toExponential().split('e').map(Number);
 | 
				
			||||||
      if (coefficient % 1 === 0) return maxValue;
 | 
					      if (coefficient % 1 === 0) return maxValue;
 | 
				
			||||||
@@ -187,7 +187,7 @@ export default {
 | 
				
			|||||||
      // for contributors' graph. If I let chartjs do this for me, it will choose different
 | 
					      // for contributors' graph. If I let chartjs do this for me, it will choose different
 | 
				
			||||||
      // maxY value for each contributors' graph which again makes it harder to compare.
 | 
					      // maxY value for each contributors' graph which again makes it harder to compare.
 | 
				
			||||||
      const maxValue = Math.max(
 | 
					      const maxValue = Math.max(
 | 
				
			||||||
        ...this.sortedContributors.map((c) => c.max_contribution_type)
 | 
					        ...this.sortedContributors.map((c) => c.max_contribution_type),
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
      const [coefficient, exp] = maxValue.toExponential().split('e').map(Number);
 | 
					      const [coefficient, exp] = maxValue.toExponential().split('e').map(Number);
 | 
				
			||||||
      if (coefficient % 1 === 0) return maxValue;
 | 
					      if (coefficient % 1 === 0) return maxValue;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -35,7 +35,7 @@ export default {
 | 
				
			|||||||
  props: {
 | 
					  props: {
 | 
				
			||||||
    locale: {
 | 
					    locale: {
 | 
				
			||||||
      type: Object,
 | 
					      type: Object,
 | 
				
			||||||
      required: true
 | 
					      required: true,
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  data: () => ({
 | 
					  data: () => ({
 | 
				
			||||||
@@ -105,12 +105,12 @@ export default {
 | 
				
			|||||||
            },
 | 
					            },
 | 
				
			||||||
            ticks: {
 | 
					            ticks: {
 | 
				
			||||||
              maxRotation: 0,
 | 
					              maxRotation: 0,
 | 
				
			||||||
              maxTicksLimit: 52
 | 
					              maxTicksLimit: 52,
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          y: {
 | 
					          y: {
 | 
				
			||||||
            ticks: {
 | 
					            ticks: {
 | 
				
			||||||
              maxTicksLimit: 6
 | 
					              maxTicksLimit: 6,
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -39,7 +39,7 @@ const sfc = {
 | 
				
			|||||||
        'repository',
 | 
					        'repository',
 | 
				
			||||||
        'user');
 | 
					        'user');
 | 
				
			||||||
      return categories;
 | 
					      return categories;
 | 
				
			||||||
    }
 | 
					    },
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  mounted() {
 | 
					  mounted() {
 | 
				
			||||||
@@ -68,7 +68,7 @@ const sfc = {
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
      // no scopes selected, show validation error
 | 
					      // no scopes selected, show validation error
 | 
				
			||||||
      showElem(warningEl);
 | 
					      showElem(warningEl);
 | 
				
			||||||
    }
 | 
					    },
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,7 +9,7 @@ export async function initCaptcha() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  const params = {
 | 
					  const params = {
 | 
				
			||||||
    sitekey: siteKey,
 | 
					    sitekey: siteKey,
 | 
				
			||||||
    theme: isDark ? 'dark' : 'light'
 | 
					    theme: isDark ? 'dark' : 'light',
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  switch (captchaEl.getAttribute('data-captcha-type')) {
 | 
					  switch (captchaEl.getAttribute('data-captcha-type')) {
 | 
				
			||||||
@@ -42,7 +42,7 @@ export async function initCaptcha() {
 | 
				
			|||||||
        siteKey: {
 | 
					        siteKey: {
 | 
				
			||||||
          instanceUrl: new URL(instanceURL),
 | 
					          instanceUrl: new URL(instanceURL),
 | 
				
			||||||
          key: siteKey,
 | 
					          key: siteKey,
 | 
				
			||||||
        }
 | 
					        },
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,7 +11,7 @@ export async function initRepoCodeFrequency() {
 | 
				
			|||||||
        loadingTitle: el.getAttribute('data-locale-loading-title'),
 | 
					        loadingTitle: el.getAttribute('data-locale-loading-title'),
 | 
				
			||||||
        loadingTitleFailed: el.getAttribute('data-locale-loading-title-failed'),
 | 
					        loadingTitleFailed: el.getAttribute('data-locale-loading-title-failed'),
 | 
				
			||||||
        loadingInfo: el.getAttribute('data-locale-loading-info'),
 | 
					        loadingInfo: el.getAttribute('data-locale-loading-info'),
 | 
				
			||||||
      }
 | 
					      },
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    View.mount(el);
 | 
					    View.mount(el);
 | 
				
			||||||
  } catch (err) {
 | 
					  } catch (err) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -80,7 +80,7 @@ export async function createMonaco(textarea, filename, editorOpts) {
 | 
				
			|||||||
    rules: [
 | 
					    rules: [
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        background: getColor('--color-code-bg'),
 | 
					        background: getColor('--color-code-bg'),
 | 
				
			||||||
      }
 | 
					      },
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    colors: {
 | 
					    colors: {
 | 
				
			||||||
      'editor.background': getColor('--color-code-bg'),
 | 
					      'editor.background': getColor('--color-code-bg'),
 | 
				
			||||||
@@ -98,7 +98,7 @@ export async function createMonaco(textarea, filename, editorOpts) {
 | 
				
			|||||||
      'input.foreground': getColor('--color-input-text'),
 | 
					      'input.foreground': getColor('--color-input-text'),
 | 
				
			||||||
      'scrollbar.shadow': getColor('--color-shadow'),
 | 
					      'scrollbar.shadow': getColor('--color-shadow'),
 | 
				
			||||||
      'progressBar.background': getColor('--color-primary'),
 | 
					      'progressBar.background': getColor('--color-primary'),
 | 
				
			||||||
    }
 | 
					    },
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Quick fix: https://github.com/microsoft/monaco-editor/issues/2962
 | 
					  // Quick fix: https://github.com/microsoft/monaco-editor/issues/2962
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -335,7 +335,7 @@ export function initGlobalLinkActions() {
 | 
				
			|||||||
          const data = await response.json();
 | 
					          const data = await response.json();
 | 
				
			||||||
          window.location.href = data.redirect;
 | 
					          window.location.href = data.redirect;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      }
 | 
					      },
 | 
				
			||||||
    }).modal('show');
 | 
					    }).modal('show');
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -139,7 +139,7 @@ export function easyMDEToolbarActions(EasyMDE, editor) {
 | 
				
			|||||||
      },
 | 
					      },
 | 
				
			||||||
      icon: svg('octicon-chevron-right'),
 | 
					      icon: svg('octicon-chevron-right'),
 | 
				
			||||||
      title: 'Add Inline Code',
 | 
					      title: 'Add Inline Code',
 | 
				
			||||||
    }
 | 
					    },
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  for (const [key, value] of Object.entries(actions)) {
 | 
					  for (const [key, value] of Object.entries(actions)) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,7 +22,7 @@ export function initCompSearchUserBox() {
 | 
				
			|||||||
        $.each(response.data, (_i, item) => {
 | 
					        $.each(response.data, (_i, item) => {
 | 
				
			||||||
          const resultItem = {
 | 
					          const resultItem = {
 | 
				
			||||||
            title: item.login,
 | 
					            title: item.login,
 | 
				
			||||||
            image: item.avatar_url
 | 
					            image: item.avatar_url,
 | 
				
			||||||
          };
 | 
					          };
 | 
				
			||||||
          if (item.full_name) {
 | 
					          if (item.full_name) {
 | 
				
			||||||
            resultItem.description = htmlEscape(item.full_name);
 | 
					            resultItem.description = htmlEscape(item.full_name);
 | 
				
			||||||
@@ -37,15 +37,15 @@ export function initCompSearchUserBox() {
 | 
				
			|||||||
        if (allowEmailInput && items.length === 0 && looksLikeEmailAddressCheck.test(searchQuery)) {
 | 
					        if (allowEmailInput && items.length === 0 && looksLikeEmailAddressCheck.test(searchQuery)) {
 | 
				
			||||||
          const resultItem = {
 | 
					          const resultItem = {
 | 
				
			||||||
            title: searchQuery,
 | 
					            title: searchQuery,
 | 
				
			||||||
            description: allowEmailDescription
 | 
					            description: allowEmailDescription,
 | 
				
			||||||
          };
 | 
					          };
 | 
				
			||||||
          items.push(resultItem);
 | 
					          items.push(resultItem);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return {results: items};
 | 
					        return {results: items};
 | 
				
			||||||
      }
 | 
					      },
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    searchFields: ['login', 'full_name'],
 | 
					    searchFields: ['login', 'full_name'],
 | 
				
			||||||
    showNoResults: false
 | 
					    showNoResults: false,
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -37,7 +37,7 @@ export function attachRefIssueContextPopup(refIssues) {
 | 
				
			|||||||
      interactiveBorder: 5,
 | 
					      interactiveBorder: 5,
 | 
				
			||||||
      onShow: () => {
 | 
					      onShow: () => {
 | 
				
			||||||
        el.firstChild.dispatchEvent(new CustomEvent('ce-load-context-popup', {detail: {owner, repo, index}}));
 | 
					        el.firstChild.dispatchEvent(new CustomEvent('ce-load-context-popup', {detail: {owner, repo, index}}));
 | 
				
			||||||
      }
 | 
					      },
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,7 +18,7 @@ export async function initRepoContributors() {
 | 
				
			|||||||
        loadingTitle: el.getAttribute('data-locale-loading-title'),
 | 
					        loadingTitle: el.getAttribute('data-locale-loading-title'),
 | 
				
			||||||
        loadingTitleFailed: el.getAttribute('data-locale-loading-title-failed'),
 | 
					        loadingTitleFailed: el.getAttribute('data-locale-loading-title-failed'),
 | 
				
			||||||
        loadingInfo: el.getAttribute('data-locale-loading-info'),
 | 
					        loadingInfo: el.getAttribute('data-locale-loading-info'),
 | 
				
			||||||
      }
 | 
					      },
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    View.mount(el);
 | 
					    View.mount(el);
 | 
				
			||||||
  } catch (err) {
 | 
					  } catch (err) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -48,7 +48,7 @@ class Source {
 | 
				
			|||||||
    this.eventSource.addEventListener(eventType, (event) => {
 | 
					    this.eventSource.addEventListener(eventType, (event) => {
 | 
				
			||||||
      this.notifyClients({
 | 
					      this.notifyClients({
 | 
				
			||||||
        type: eventType,
 | 
					        type: eventType,
 | 
				
			||||||
        data: event.data
 | 
					        data: event.data,
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,19 +20,19 @@ function getDefaultSvgBoundsIfUndefined(text, src) {
 | 
				
			|||||||
    if (img.width > 1 && img.width < MaxSize && img.height > 1 && img.height < MaxSize) {
 | 
					    if (img.width > 1 && img.width < MaxSize && img.height > 1 && img.height < MaxSize) {
 | 
				
			||||||
      return {
 | 
					      return {
 | 
				
			||||||
        width: img.width,
 | 
					        width: img.width,
 | 
				
			||||||
        height: img.height
 | 
					        height: img.height,
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (svg.hasAttribute('viewBox')) {
 | 
					    if (svg.hasAttribute('viewBox')) {
 | 
				
			||||||
      const viewBox = svg.viewBox.baseVal;
 | 
					      const viewBox = svg.viewBox.baseVal;
 | 
				
			||||||
      return {
 | 
					      return {
 | 
				
			||||||
        width: DefaultSize,
 | 
					        width: DefaultSize,
 | 
				
			||||||
        height: DefaultSize * viewBox.width / viewBox.height
 | 
					        height: DefaultSize * viewBox.width / viewBox.height,
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return {
 | 
					    return {
 | 
				
			||||||
      width: DefaultSize,
 | 
					      width: DefaultSize,
 | 
				
			||||||
      height: DefaultSize
 | 
					      height: DefaultSize,
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  return null;
 | 
					  return null;
 | 
				
			||||||
@@ -42,15 +42,15 @@ export function initImageDiff() {
 | 
				
			|||||||
  function createContext(image1, image2) {
 | 
					  function createContext(image1, image2) {
 | 
				
			||||||
    const size1 = {
 | 
					    const size1 = {
 | 
				
			||||||
      width: image1 && image1.width || 0,
 | 
					      width: image1 && image1.width || 0,
 | 
				
			||||||
      height: image1 && image1.height || 0
 | 
					      height: image1 && image1.height || 0,
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    const size2 = {
 | 
					    const size2 = {
 | 
				
			||||||
      width: image2 && image2.width || 0,
 | 
					      width: image2 && image2.width || 0,
 | 
				
			||||||
      height: image2 && image2.height || 0
 | 
					      height: image2 && image2.height || 0,
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    const max = {
 | 
					    const max = {
 | 
				
			||||||
      width: Math.max(size2.width, size1.width),
 | 
					      width: Math.max(size2.width, size1.width),
 | 
				
			||||||
      height: Math.max(size2.height, size1.height)
 | 
					      height: Math.max(size2.height, size1.height),
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return {
 | 
					    return {
 | 
				
			||||||
@@ -63,8 +63,8 @@ export function initImageDiff() {
 | 
				
			|||||||
        Math.floor(max.width - size1.width) / 2,
 | 
					        Math.floor(max.width - size1.width) / 2,
 | 
				
			||||||
        Math.floor(max.height - size1.height) / 2,
 | 
					        Math.floor(max.height - size1.height) / 2,
 | 
				
			||||||
        Math.floor(max.width - size2.width) / 2,
 | 
					        Math.floor(max.width - size2.width) / 2,
 | 
				
			||||||
        Math.floor(max.height - size2.height) / 2
 | 
					        Math.floor(max.height - size2.height) / 2,
 | 
				
			||||||
      ]
 | 
					      ],
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -79,12 +79,12 @@ export function initImageDiff() {
 | 
				
			|||||||
      path: this.getAttribute('data-path-after'),
 | 
					      path: this.getAttribute('data-path-after'),
 | 
				
			||||||
      mime: this.getAttribute('data-mime-after'),
 | 
					      mime: this.getAttribute('data-mime-after'),
 | 
				
			||||||
      $images: $container.find('img.image-after'), // matches 3 <img>
 | 
					      $images: $container.find('img.image-after'), // matches 3 <img>
 | 
				
			||||||
      $boundsInfo: $container.find('.bounds-info-after')
 | 
					      $boundsInfo: $container.find('.bounds-info-after'),
 | 
				
			||||||
    }, {
 | 
					    }, {
 | 
				
			||||||
      path: this.getAttribute('data-path-before'),
 | 
					      path: this.getAttribute('data-path-before'),
 | 
				
			||||||
      mime: this.getAttribute('data-mime-before'),
 | 
					      mime: this.getAttribute('data-mime-before'),
 | 
				
			||||||
      $images: $container.find('img.image-before'), // matches 3 <img>
 | 
					      $images: $container.find('img.image-before'), // matches 3 <img>
 | 
				
			||||||
      $boundsInfo: $container.find('.bounds-info-before')
 | 
					      $boundsInfo: $container.find('.bounds-info-before'),
 | 
				
			||||||
    }];
 | 
					    }];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    await Promise.all(imageInfos.map(async (info) => {
 | 
					    await Promise.all(imageInfos.map(async (info) => {
 | 
				
			||||||
@@ -222,21 +222,21 @@ export function initImageDiff() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
      sizes.image1.css({
 | 
					      sizes.image1.css({
 | 
				
			||||||
        width: sizes.size1.width * factor,
 | 
					        width: sizes.size1.width * factor,
 | 
				
			||||||
        height: sizes.size1.height * factor
 | 
					        height: sizes.size1.height * factor,
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
      sizes.image2.css({
 | 
					      sizes.image2.css({
 | 
				
			||||||
        width: sizes.size2.width * factor,
 | 
					        width: sizes.size2.width * factor,
 | 
				
			||||||
        height: sizes.size2.height * factor
 | 
					        height: sizes.size2.height * factor,
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
      sizes.image1.parent().css({
 | 
					      sizes.image1.parent().css({
 | 
				
			||||||
        margin: `${sizes.ratio[1] * factor}px ${sizes.ratio[0] * factor}px`,
 | 
					        margin: `${sizes.ratio[1] * factor}px ${sizes.ratio[0] * factor}px`,
 | 
				
			||||||
        width: sizes.size1.width * factor + 2,
 | 
					        width: sizes.size1.width * factor + 2,
 | 
				
			||||||
        height: sizes.size1.height * factor + 2
 | 
					        height: sizes.size1.height * factor + 2,
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
      sizes.image2.parent().css({
 | 
					      sizes.image2.parent().css({
 | 
				
			||||||
        margin: `${sizes.ratio[3] * factor}px ${sizes.ratio[2] * factor}px`,
 | 
					        margin: `${sizes.ratio[3] * factor}px ${sizes.ratio[2] * factor}px`,
 | 
				
			||||||
        width: sizes.size2.width * factor + 2,
 | 
					        width: sizes.size2.width * factor + 2,
 | 
				
			||||||
        height: sizes.size2.height * factor + 2
 | 
					        height: sizes.size2.height * factor + 2,
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      // some inner elements are `position: absolute`, so the container's height must be large enough
 | 
					      // some inner elements are `position: absolute`, so the container's height must be large enough
 | 
				
			||||||
@@ -248,7 +248,7 @@ export function initImageDiff() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
      const $range = $container.find("input[type='range']");
 | 
					      const $range = $container.find("input[type='range']");
 | 
				
			||||||
      const onInput = () => sizes.image1.parent().css({
 | 
					      const onInput = () => sizes.image1.parent().css({
 | 
				
			||||||
        opacity: $range.val() / 100
 | 
					        opacity: $range.val() / 100,
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
      $range.on('input', onInput);
 | 
					      $range.on('input', onInput);
 | 
				
			||||||
      onInput();
 | 
					      onInput();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,7 +19,7 @@ function initPreInstall() {
 | 
				
			|||||||
  const defaultDbHosts = {
 | 
					  const defaultDbHosts = {
 | 
				
			||||||
    mysql: '127.0.0.1:3306',
 | 
					    mysql: '127.0.0.1:3306',
 | 
				
			||||||
    postgres: '127.0.0.1:5432',
 | 
					    postgres: '127.0.0.1:5432',
 | 
				
			||||||
    mssql: '127.0.0.1:1433'
 | 
					    mssql: '127.0.0.1:1433',
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const dbHost = document.getElementById('db_host');
 | 
					  const dbHost = document.getElementById('db_host');
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,14 +26,14 @@ export function initOrgTeamSearchRepoBox() {
 | 
				
			|||||||
        $.each(response.data, (_i, item) => {
 | 
					        $.each(response.data, (_i, item) => {
 | 
				
			||||||
          items.push({
 | 
					          items.push({
 | 
				
			||||||
            title: item.repository.full_name.split('/')[1],
 | 
					            title: item.repository.full_name.split('/')[1],
 | 
				
			||||||
            description: item.repository.full_name
 | 
					            description: item.repository.full_name,
 | 
				
			||||||
          });
 | 
					          });
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return {results: items};
 | 
					        return {results: items};
 | 
				
			||||||
      }
 | 
					      },
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    searchFields: ['full_name'],
 | 
					    searchFields: ['full_name'],
 | 
				
			||||||
    showNoResults: false
 | 
					    showNoResults: false,
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,7 +11,7 @@ export async function initRepoRecentCommits() {
 | 
				
			|||||||
        loadingTitle: el.getAttribute('data-locale-loading-title'),
 | 
					        loadingTitle: el.getAttribute('data-locale-loading-title'),
 | 
				
			||||||
        loadingTitleFailed: el.getAttribute('data-locale-loading-title-failed'),
 | 
					        loadingTitleFailed: el.getAttribute('data-locale-loading-title-failed'),
 | 
				
			||||||
        loadingInfo: el.getAttribute('data-locale-loading-info'),
 | 
					        loadingInfo: el.getAttribute('data-locale-loading-info'),
 | 
				
			||||||
      }
 | 
					      },
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    View.mount(el);
 | 
					    View.mount(el);
 | 
				
			||||||
  } catch (err) {
 | 
					  } catch (err) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -116,7 +116,7 @@ function showLineButton() {
 | 
				
			|||||||
      tippy.popper.addEventListener('click', () => {
 | 
					      tippy.popper.addEventListener('click', () => {
 | 
				
			||||||
        tippy.hide();
 | 
					        tippy.hide();
 | 
				
			||||||
      }, {once: true});
 | 
					      }, {once: true});
 | 
				
			||||||
    }
 | 
					    },
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -146,7 +146,7 @@ export function initRepoTopicBar() {
 | 
				
			|||||||
      addedValue = addedValue.toLowerCase().trim();
 | 
					      addedValue = addedValue.toLowerCase().trim();
 | 
				
			||||||
      $($addedChoice).attr('data-value', addedValue);
 | 
					      $($addedChoice).attr('data-value', addedValue);
 | 
				
			||||||
      $($addedChoice).attr('data-text', addedValue);
 | 
					      $($addedChoice).attr('data-text', addedValue);
 | 
				
			||||||
    }
 | 
					    },
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  $.fn.form.settings.rules.validateTopic = function (_values, regExp) {
 | 
					  $.fn.form.settings.rules.validateTopic = function (_values, regExp) {
 | 
				
			||||||
@@ -168,14 +168,14 @@ export function initRepoTopicBar() {
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            type: 'validateTopic',
 | 
					            type: 'validateTopic',
 | 
				
			||||||
            value: /^\s*[a-z0-9][-.a-z0-9]{0,35}\s*$/,
 | 
					            value: /^\s*[a-z0-9][-.a-z0-9]{0,35}\s*$/,
 | 
				
			||||||
            prompt: topicPrompts.formatPrompt
 | 
					            prompt: topicPrompts.formatPrompt,
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
            type: 'maxCount[25]',
 | 
					            type: 'maxCount[25]',
 | 
				
			||||||
            prompt: topicPrompts.countPrompt
 | 
					            prompt: topicPrompts.countPrompt,
 | 
				
			||||||
          }
 | 
					          },
 | 
				
			||||||
        ]
 | 
					        ],
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
    }
 | 
					    },
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -60,7 +60,7 @@ function showContentHistoryDetail(issueBaseUrl, commentId, historyId, itemTitleH
 | 
				
			|||||||
    },
 | 
					    },
 | 
				
			||||||
    onHide() {
 | 
					    onHide() {
 | 
				
			||||||
      $(this).dropdown('clear', true);
 | 
					      $(this).dropdown('clear', true);
 | 
				
			||||||
    }
 | 
					    },
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
  $dialog.modal({
 | 
					  $dialog.modal({
 | 
				
			||||||
    async onShow() {
 | 
					    async onShow() {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -59,7 +59,7 @@ async function updateDeadline(deadlineString) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  try {
 | 
					  try {
 | 
				
			||||||
    const response = await POST($('#update-issue-deadline-form').attr('action'), {
 | 
					    const response = await POST($('#update-issue-deadline-form').attr('action'), {
 | 
				
			||||||
      data: {due_date: realDeadline}
 | 
					      data: {due_date: realDeadline},
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (response.ok) {
 | 
					    if (response.ok) {
 | 
				
			||||||
@@ -268,7 +268,7 @@ export function initRepoPullRequestUpdate() {
 | 
				
			|||||||
        $pullUpdateButton.find('.button-text').text($choice.text());
 | 
					        $pullUpdateButton.find('.button-text').text($choice.text());
 | 
				
			||||||
        $pullUpdateButton.data('do', $url);
 | 
					        $pullUpdateButton.data('do', $url);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    },
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -316,7 +316,7 @@ export function initRepoIssueReferenceRepositorySearch() {
 | 
				
			|||||||
          $.each(response.data, (_r, repo) => {
 | 
					          $.each(response.data, (_r, repo) => {
 | 
				
			||||||
            filteredResponse.results.push({
 | 
					            filteredResponse.results.push({
 | 
				
			||||||
              name: htmlEscape(repo.repository.full_name),
 | 
					              name: htmlEscape(repo.repository.full_name),
 | 
				
			||||||
              value: repo.repository.full_name
 | 
					              value: repo.repository.full_name,
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
          });
 | 
					          });
 | 
				
			||||||
          return filteredResponse;
 | 
					          return filteredResponse;
 | 
				
			||||||
@@ -327,7 +327,7 @@ export function initRepoIssueReferenceRepositorySearch() {
 | 
				
			|||||||
        const $form = $choice.closest('form');
 | 
					        const $form = $choice.closest('form');
 | 
				
			||||||
        $form.attr('action', `${appSubUrl}/${_text}/issues/new`);
 | 
					        $form.attr('action', `${appSubUrl}/${_text}/issues/new`);
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      fullTextSearch: true
 | 
					      fullTextSearch: true,
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -443,7 +443,7 @@ export function initRepoPullRequestReview() {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        window.scrollTo({
 | 
					        window.scrollTo({
 | 
				
			||||||
          top: $commentDiv.offset().top - offset,
 | 
					          top: $commentDiv.offset().top - offset,
 | 
				
			||||||
          behavior: 'instant'
 | 
					          behavior: 'instant',
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -661,7 +661,7 @@ export function initRepoIssueBranchSelect() {
 | 
				
			|||||||
    // Replace branch name to keep translation from HTML template
 | 
					    // Replace branch name to keep translation from HTML template
 | 
				
			||||||
    $selectionTextField.html($selectionTextField.html().replace(
 | 
					    $selectionTextField.html($selectionTextField.html().replace(
 | 
				
			||||||
      `${baseName}:${branchNameOld}`,
 | 
					      `${baseName}:${branchNameOld}`,
 | 
				
			||||||
      `${baseName}:${branchNameNew}`
 | 
					      `${baseName}:${branchNameNew}`,
 | 
				
			||||||
    ));
 | 
					    ));
 | 
				
			||||||
    $selectionTextField.data('branch', branchNameNew); // update branch name in setting
 | 
					    $selectionTextField.data('branch', branchNameNew); // update branch name in setting
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
@@ -695,7 +695,7 @@ export function initIssueTemplateCommentEditors($commentForm) {
 | 
				
			|||||||
    const editor = await initComboMarkdownEditor($markdownEditor, {
 | 
					    const editor = await initComboMarkdownEditor($markdownEditor, {
 | 
				
			||||||
      onContentChanged: (editor) => {
 | 
					      onContentChanged: (editor) => {
 | 
				
			||||||
        $formField.val(editor.value());
 | 
					        $formField.val(editor.value());
 | 
				
			||||||
      }
 | 
					      },
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $formField.on('focus', async () => {
 | 
					    $formField.on('focus', async () => {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -39,7 +39,7 @@ export function initRepoSettingsCollaboration() {
 | 
				
			|||||||
            $text.text('(none)'); // prevent from misleading users when the access mode is undefined
 | 
					            $text.text('(none)'); // prevent from misleading users when the access mode is undefined
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        }, 0);
 | 
					        }, 0);
 | 
				
			||||||
      }
 | 
					      },
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -56,15 +56,15 @@ export function initRepoSettingSearchTeamBox() {
 | 
				
			|||||||
        $.each(response.data, (_i, item) => {
 | 
					        $.each(response.data, (_i, item) => {
 | 
				
			||||||
          items.push({
 | 
					          items.push({
 | 
				
			||||||
            title: item.name,
 | 
					            title: item.name,
 | 
				
			||||||
            description: `${item.permission} access` // TODO: translate this string
 | 
					            description: `${item.permission} access`, // TODO: translate this string
 | 
				
			||||||
          });
 | 
					          });
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return {results: items};
 | 
					        return {results: items};
 | 
				
			||||||
      }
 | 
					      },
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    searchFields: ['name', 'description'],
 | 
					    searchFields: ['name', 'description'],
 | 
				
			||||||
    showNoResults: false
 | 
					    showNoResults: false,
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,13 +29,13 @@ export function initRepoTemplateSearch() {
 | 
				
			|||||||
            const filteredResponse = {success: true, results: []};
 | 
					            const filteredResponse = {success: true, results: []};
 | 
				
			||||||
            filteredResponse.results.push({
 | 
					            filteredResponse.results.push({
 | 
				
			||||||
              name: '',
 | 
					              name: '',
 | 
				
			||||||
              value: ''
 | 
					              value: '',
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
            // Parse the response from the api to work with our dropdown
 | 
					            // Parse the response from the api to work with our dropdown
 | 
				
			||||||
            $.each(response.data, (_r, repo) => {
 | 
					            $.each(response.data, (_r, repo) => {
 | 
				
			||||||
              filteredResponse.results.push({
 | 
					              filteredResponse.results.push({
 | 
				
			||||||
                name: htmlEscape(repo.repository.full_name),
 | 
					                name: htmlEscape(repo.repository.full_name),
 | 
				
			||||||
                value: repo.repository.id
 | 
					                value: repo.repository.id,
 | 
				
			||||||
              });
 | 
					              });
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
            return filteredResponse;
 | 
					            return filteredResponse;
 | 
				
			||||||
@@ -43,7 +43,7 @@ export function initRepoTemplateSearch() {
 | 
				
			|||||||
          cache: false,
 | 
					          cache: false,
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        fullTextSearch: true
 | 
					        fullTextSearch: true,
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
  $('#uid').on('change', changeOwner);
 | 
					  $('#uid').on('change', changeOwner);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -60,7 +60,7 @@ async function initRepoWikiFormEditor() {
 | 
				
			|||||||
        'gitea-code-inline', 'code', 'quote', '|', 'gitea-checkbox-empty', 'gitea-checkbox-checked', '|',
 | 
					        'gitea-code-inline', 'code', 'quote', '|', 'gitea-checkbox-empty', 'gitea-checkbox-checked', '|',
 | 
				
			||||||
        'unordered-list', 'ordered-list', '|',
 | 
					        'unordered-list', 'ordered-list', '|',
 | 
				
			||||||
        'link', 'image', 'table', 'horizontal-rule', '|',
 | 
					        'link', 'image', 'table', 'horizontal-rule', '|',
 | 
				
			||||||
        'preview', 'fullscreen', 'side-by-side', '|', 'gitea-switch-to-textarea'
 | 
					        'preview', 'fullscreen', 'side-by-side', '|', 'gitea-switch-to-textarea',
 | 
				
			||||||
      ],
 | 
					      ],
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,7 +25,7 @@ function makeCollections({mentions, emoji}) {
 | 
				
			|||||||
      },
 | 
					      },
 | 
				
			||||||
      menuItemTemplate: (item) => {
 | 
					      menuItemTemplate: (item) => {
 | 
				
			||||||
        return `<div class="tribute-item">${emojiHTML(item.original)}<span>${htmlEscape(item.original)}</span></div>`;
 | 
					        return `<div class="tribute-item">${emojiHTML(item.original)}<span>${htmlEscape(item.original)}</span></div>`;
 | 
				
			||||||
      }
 | 
					      },
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -41,7 +41,7 @@ function makeCollections({mentions, emoji}) {
 | 
				
			|||||||
            ${item.original.fullname && item.original.fullname !== '' ? `<span class="fullname">${htmlEscape(item.original.fullname)}</span>` : ''}
 | 
					            ${item.original.fullname && item.original.fullname !== '' ? `<span class="fullname">${htmlEscape(item.original.fullname)}</span>` : ''}
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
        `;
 | 
					        `;
 | 
				
			||||||
      }
 | 
					      },
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,7 +26,7 @@ export async function initUserAuthWebAuthn() {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
  try {
 | 
					  try {
 | 
				
			||||||
    const credential = await navigator.credentials.get({
 | 
					    const credential = await navigator.credentials.get({
 | 
				
			||||||
      publicKey: options.publicKey
 | 
					      publicKey: options.publicKey,
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    await verifyAssertion(credential);
 | 
					    await verifyAssertion(credential);
 | 
				
			||||||
  } catch (err) {
 | 
					  } catch (err) {
 | 
				
			||||||
@@ -37,7 +37,7 @@ export async function initUserAuthWebAuthn() {
 | 
				
			|||||||
    delete options.publicKey.extensions.appid;
 | 
					    delete options.publicKey.extensions.appid;
 | 
				
			||||||
    try {
 | 
					    try {
 | 
				
			||||||
      const credential = await navigator.credentials.get({
 | 
					      const credential = await navigator.credentials.get({
 | 
				
			||||||
        publicKey: options.publicKey
 | 
					        publicKey: options.publicKey,
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
      await verifyAssertion(credential);
 | 
					      await verifyAssertion(credential);
 | 
				
			||||||
    } catch (err) {
 | 
					    } catch (err) {
 | 
				
			||||||
@@ -185,7 +185,7 @@ async function webAuthnRegisterRequest() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  try {
 | 
					  try {
 | 
				
			||||||
    const credential = await navigator.credentials.create({
 | 
					    const credential = await navigator.credentials.create({
 | 
				
			||||||
      publicKey: options.publicKey
 | 
					      publicKey: options.publicKey,
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    await webauthnRegistered(credential);
 | 
					    await webauthnRegistered(credential);
 | 
				
			||||||
  } catch (err) {
 | 
					  } catch (err) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -148,7 +148,7 @@ export function initGlobalTooltips() {
 | 
				
			|||||||
  const observerConnect = (observer) => observer.observe(document, {
 | 
					  const observerConnect = (observer) => observer.observe(document, {
 | 
				
			||||||
    subtree: true,
 | 
					    subtree: true,
 | 
				
			||||||
    childList: true,
 | 
					    childList: true,
 | 
				
			||||||
    attributeFilter: ['data-tooltip-content', 'title']
 | 
					    attributeFilter: ['data-tooltip-content', 'title'],
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
  const observer = new MutationObserver((mutationList, observer) => {
 | 
					  const observer = new MutationObserver((mutationList, observer) => {
 | 
				
			||||||
    const pending = observer.takeRecords();
 | 
					    const pending = observer.takeRecords();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,11 +21,11 @@ window.addEventListener('load', async () => {
 | 
				
			|||||||
    docExpansion: 'none',
 | 
					    docExpansion: 'none',
 | 
				
			||||||
    defaultModelRendering: 'model', // don't show examples by default, because they may be incomplete
 | 
					    defaultModelRendering: 'model', // don't show examples by default, because they may be incomplete
 | 
				
			||||||
    presets: [
 | 
					    presets: [
 | 
				
			||||||
      SwaggerUI.presets.apis
 | 
					      SwaggerUI.presets.apis,
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    plugins: [
 | 
					    plugins: [
 | 
				
			||||||
      SwaggerUI.plugins.DownloadUrl
 | 
					      SwaggerUI.plugins.DownloadUrl,
 | 
				
			||||||
    ]
 | 
					    ],
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  window.ui = ui;
 | 
					  window.ui = ui;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -189,7 +189,7 @@ export const SvgIcon = {
 | 
				
			|||||||
    name: {type: String, required: true},
 | 
					    name: {type: String, required: true},
 | 
				
			||||||
    size: {type: Number, default: 16},
 | 
					    size: {type: Number, default: 16},
 | 
				
			||||||
    className: {type: String, default: ''},
 | 
					    className: {type: String, default: ''},
 | 
				
			||||||
    symbolId: {type: String}
 | 
					    symbolId: {type: String},
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  render() {
 | 
					  render() {
 | 
				
			||||||
    let {svgOuter, svgInnerHtml} = svgParseOuterInner(this.name);
 | 
					    let {svgOuter, svgInnerHtml} = svgParseOuterInner(this.name);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -191,7 +191,7 @@ export function autosize(textarea, {viewportMarginBottom = 0} = {}) {
 | 
				
			|||||||
      textarea.removeEventListener('mousemove', onUserResize);
 | 
					      textarea.removeEventListener('mousemove', onUserResize);
 | 
				
			||||||
      textarea.removeEventListener('input', resizeToFit);
 | 
					      textarea.removeEventListener('input', resizeToFit);
 | 
				
			||||||
      textarea.form?.removeEventListener('reset', onFormReset);
 | 
					      textarea.form?.removeEventListener('reset', onFormReset);
 | 
				
			||||||
    }
 | 
					    },
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,7 +9,7 @@ try {
 | 
				
			|||||||
      return {
 | 
					      return {
 | 
				
			||||||
        format(value) {
 | 
					        format(value) {
 | 
				
			||||||
          return ` ${value} ${options.unit}`;
 | 
					          return ` ${value} ${options.unit}`;
 | 
				
			||||||
        }
 | 
					        },
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return intlNumberFormat(locales, options);
 | 
					    return intlNumberFormat(locales, options);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -178,7 +178,7 @@ export default {
 | 
				
			|||||||
                ],
 | 
					                ],
 | 
				
			||||||
              },
 | 
					              },
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
          }
 | 
					          },
 | 
				
			||||||
        ],
 | 
					        ],
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
@@ -191,14 +191,14 @@ export default {
 | 
				
			|||||||
        type: 'asset/resource',
 | 
					        type: 'asset/resource',
 | 
				
			||||||
        generator: {
 | 
					        generator: {
 | 
				
			||||||
          filename: 'fonts/[name].[contenthash:8][ext]',
 | 
					          filename: 'fonts/[name].[contenthash:8][ext]',
 | 
				
			||||||
        }
 | 
					        },
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        test: /\.png$/i,
 | 
					        test: /\.png$/i,
 | 
				
			||||||
        type: 'asset/resource',
 | 
					        type: 'asset/resource',
 | 
				
			||||||
        generator: {
 | 
					        generator: {
 | 
				
			||||||
          filename: 'img/webpack/[name].[contenthash:8][ext]',
 | 
					          filename: 'img/webpack/[name].[contenthash:8][ext]',
 | 
				
			||||||
        }
 | 
					        },
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user