forked from MapComplete/MapComplete
Docs: improve documentation with quick overview table of the most important questions
This commit is contained in:
parent
4078b33a87
commit
aa5c309887
6 changed files with 78 additions and 20 deletions
|
@ -406,6 +406,7 @@ class LayerOverviewUtils extends Script {
|
||||||
|
|
||||||
for (const tr of sharedQuestions.tagRenderings) {
|
for (const tr of sharedQuestions.tagRenderings) {
|
||||||
const tagRendering = <QuestionableTagRenderingConfigJson>tr
|
const tagRendering = <QuestionableTagRenderingConfigJson>tr
|
||||||
|
tagRendering._definedIn = ["questions", tr["id"]]
|
||||||
dict.set(tagRendering["id"], tagRendering)
|
dict.set(tagRendering["id"], tagRendering)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -62,7 +62,7 @@ export class ExpandTagRendering extends Conversion<
|
||||||
spec: string | { builtin: string | string[] } | TagRenderingConfigJson,
|
spec: string | { builtin: string | string[] } | TagRenderingConfigJson,
|
||||||
ctx: ConversionContext
|
ctx: ConversionContext
|
||||||
): QuestionableTagRenderingConfigJson[] {
|
): QuestionableTagRenderingConfigJson[] {
|
||||||
const trs = this.convertOnce(<any>spec, ctx)?.map((tr) =>
|
const trs = this.convertOnce(spec, ctx)?.map((tr) =>
|
||||||
this.pruneMappings<TagRenderingConfigJson & { id: string }>(tr, ctx)
|
this.pruneMappings<TagRenderingConfigJson & { id: string }>(tr, ctx)
|
||||||
)
|
)
|
||||||
if (!Array.isArray(trs)) {
|
if (!Array.isArray(trs)) {
|
||||||
|
@ -231,6 +231,8 @@ export class ExpandTagRendering extends Conversion<
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
found._definedIn = [layer.id, found.id]
|
||||||
|
|
||||||
found = contextWriter.convertStrict(
|
found = contextWriter.convertStrict(
|
||||||
found,
|
found,
|
||||||
ConversionContext.construct(
|
ConversionContext.construct(
|
||||||
|
@ -248,9 +250,9 @@ export class ExpandTagRendering extends Conversion<
|
||||||
}
|
}
|
||||||
|
|
||||||
private convertOnce(
|
private convertOnce(
|
||||||
tr: string | { builtin: string } | TagRenderingConfigJson,
|
tr: string | { builtin: string | string[] } | TagRenderingConfigJson,
|
||||||
ctx: ConversionContext
|
ctx: ConversionContext
|
||||||
): TagRenderingConfigJson[] {
|
): (TagRenderingConfigJson & { id: string })[] {
|
||||||
const state = this._state
|
const state = this._state
|
||||||
|
|
||||||
if (tr === undefined) {
|
if (tr === undefined) {
|
||||||
|
|
|
@ -1,18 +1,6 @@
|
||||||
import {
|
import { Concat, DesugaringContext, DesugaringStep, Each, FirstOf, Fuse, On, SetDefault } from "./Conversion"
|
||||||
Concat,
|
|
||||||
DesugaringContext,
|
|
||||||
DesugaringStep,
|
|
||||||
Each,
|
|
||||||
FirstOf,
|
|
||||||
Fuse,
|
|
||||||
On,
|
|
||||||
SetDefault,
|
|
||||||
} from "./Conversion"
|
|
||||||
import { LayerConfigJson } from "../Json/LayerConfigJson"
|
import { LayerConfigJson } from "../Json/LayerConfigJson"
|
||||||
import {
|
import { MinimalTagRenderingConfigJson, TagRenderingConfigJson } from "../Json/TagRenderingConfigJson"
|
||||||
MinimalTagRenderingConfigJson,
|
|
||||||
TagRenderingConfigJson,
|
|
||||||
} from "../Json/TagRenderingConfigJson"
|
|
||||||
import { Utils } from "../../../Utils"
|
import { Utils } from "../../../Utils"
|
||||||
import RewritableConfigJson from "../Json/RewritableConfigJson"
|
import RewritableConfigJson from "../Json/RewritableConfigJson"
|
||||||
import SpecialVisualizations from "../../../UI/SpecialVisualizations"
|
import SpecialVisualizations from "../../../UI/SpecialVisualizations"
|
||||||
|
@ -265,6 +253,7 @@ export class AddQuestionBox extends DesugaringStep<LayerConfigJson> {
|
||||||
seen.add("hidden")
|
seen.add("hidden")
|
||||||
const question: QuestionableTagRenderingConfigJson = {
|
const question: QuestionableTagRenderingConfigJson = {
|
||||||
id: "leftover-questions",
|
id: "leftover-questions",
|
||||||
|
labels: ["ignore-docs", "added_by_default"],
|
||||||
render: {
|
render: {
|
||||||
"*": `{questions( ,${Array.from(seen).join(";")})}`,
|
"*": `{questions( ,${Array.from(seen).join(";")})}`,
|
||||||
},
|
},
|
||||||
|
|
|
@ -228,4 +228,10 @@ export interface TagRenderingConfigJson {
|
||||||
* This tagRendering can introduce this builtin filter
|
* This tagRendering can introduce this builtin filter
|
||||||
*/
|
*/
|
||||||
filter?: string[] | true
|
filter?: string[] | true
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper to indicate where the tagRendering was originally defined
|
||||||
|
* group: hidden
|
||||||
|
*/
|
||||||
|
_definedIn?: [string, string]
|
||||||
}
|
}
|
||||||
|
|
|
@ -376,6 +376,59 @@ export default class LayerConfig extends WithContextLoader {
|
||||||
return this.mapRendering.some((r) => r.location.has("point"))
|
return this.mapRendering.some((r) => r.location.has("point"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A quick overview table of all the elements in the popup-box
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
private generateDocumentationQuickTable(): string {
|
||||||
|
|
||||||
|
|
||||||
|
return MarkdownUtils.table(
|
||||||
|
["id", "question", "labels", "freeform key"],
|
||||||
|
this.tagRenderings
|
||||||
|
.filter(tr => tr.labels.indexOf("ignore_docs") < 0)
|
||||||
|
.map(tr => {
|
||||||
|
|
||||||
|
let key = "_Multiple choice only_"
|
||||||
|
if (tr.freeform) {
|
||||||
|
const type = `[${tr.freeform.type}](../SpecialInputElements.md#${tr.freeform.type})`
|
||||||
|
|
||||||
|
key = `*[${tr.freeform.key}](https://wiki.osm.org/wiki/Key:${tr.freeform.key})* (${type})`
|
||||||
|
}
|
||||||
|
let origDef = ""
|
||||||
|
if (tr._definedIn) {
|
||||||
|
let [layer, id] = tr._definedIn
|
||||||
|
if (layer == "questions") {
|
||||||
|
layer = "./BuiltinQuestions"
|
||||||
|
} else {
|
||||||
|
layer = "./" + layer
|
||||||
|
}
|
||||||
|
origDef = `<br/> _(Original in [${tr._definedIn[0]}](${layer}.md#${id}))_`
|
||||||
|
}
|
||||||
|
const q = tr.question?.Subs(this.baseTags)?.txt?.trim()
|
||||||
|
let r = tr.render?.txt
|
||||||
|
if (r && r !== "") {
|
||||||
|
r = `_${r}_`
|
||||||
|
}
|
||||||
|
let options: string = undefined
|
||||||
|
if (tr.mappings?.length > 0) {
|
||||||
|
options = `${tr.mappings.length} options`
|
||||||
|
}
|
||||||
|
|
||||||
|
return [
|
||||||
|
`[${tr.id}](#${tr.id}) ${origDef}`,
|
||||||
|
Utils.NoNull([q, r, options]).join("<br/>"),
|
||||||
|
tr.labels.join(", "),
|
||||||
|
key
|
||||||
|
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public generateDocumentation(
|
public generateDocumentation(
|
||||||
usedInThemes: string[],
|
usedInThemes: string[],
|
||||||
layerIsNeededBy?: Map<string, string[]>,
|
layerIsNeededBy?: Map<string, string[]>,
|
||||||
|
@ -530,8 +583,7 @@ export default class LayerConfig extends WithContextLoader {
|
||||||
let quickOverview: string[] = []
|
let quickOverview: string[] = []
|
||||||
if (tableRows.length > 0) {
|
if (tableRows.length > 0) {
|
||||||
quickOverview = [
|
quickOverview = [
|
||||||
"**Warning:**",
|
"**Warning:**: this quick overview is incomplete",
|
||||||
"this quick overview is incomplete",
|
|
||||||
MarkdownUtils.table(
|
MarkdownUtils.table(
|
||||||
["attribute", "type", "values which are supported by this layer"],
|
["attribute", "type", "values which are supported by this layer"],
|
||||||
tableRows
|
tableRows
|
||||||
|
@ -603,7 +655,9 @@ export default class LayerConfig extends WithContextLoader {
|
||||||
...presets,
|
...presets,
|
||||||
...tagsDescription,
|
...tagsDescription,
|
||||||
"## Supported attributes",
|
"## Supported attributes",
|
||||||
quickOverview,
|
...quickOverview,
|
||||||
|
"## Featureview elements and TagRenderings",
|
||||||
|
this.generateDocumentationQuickTable(),
|
||||||
...this.tagRenderings
|
...this.tagRenderings
|
||||||
.filter((tr) => tr.labels.indexOf("ignore_docs") < 0)
|
.filter((tr) => tr.labels.indexOf("ignore_docs") < 0)
|
||||||
.map((tr) => tr.GenerateDocumentation()),
|
.map((tr) => tr.GenerateDocumentation()),
|
||||||
|
|
|
@ -60,6 +60,11 @@ export default class TagRenderingConfig {
|
||||||
|
|
||||||
public readonly configuration_warnings: string[] = []
|
public readonly configuration_warnings: string[] = []
|
||||||
|
|
||||||
|
/**
|
||||||
|
* States where this was originally defined, if imported
|
||||||
|
*/
|
||||||
|
public readonly _definedIn: [string, string] = undefined
|
||||||
|
|
||||||
public readonly freeform?: {
|
public readonly freeform?: {
|
||||||
readonly key: string
|
readonly key: string
|
||||||
readonly type: ValidatorType
|
readonly type: ValidatorType
|
||||||
|
@ -147,6 +152,7 @@ export default class TagRenderingConfig {
|
||||||
this.questionHintIsMd = json["questionHintIsMd"] ?? false
|
this.questionHintIsMd = json["questionHintIsMd"] ?? false
|
||||||
this.alwaysForceSaveButton = json["#force-save-button"] === "yes"
|
this.alwaysForceSaveButton = json["#force-save-button"] === "yes"
|
||||||
this.description = Translations.T(json.description, translationKey + ".description")
|
this.description = Translations.T(json.description, translationKey + ".description")
|
||||||
|
this._definedIn = json._definedIn
|
||||||
if (json.onSoftDelete && !Array.isArray(json.onSoftDelete)) {
|
if (json.onSoftDelete && !Array.isArray(json.onSoftDelete)) {
|
||||||
throw context + ".onSoftDelete Not an array: " + typeof json.onSoftDelete
|
throw context + ".onSoftDelete Not an array: " + typeof json.onSoftDelete
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue