getStrOptions = (v, optsStr, exclude_values_string) => {
  const exclude_values = exclude_values_string
    ? new Set(
        exclude_values_string
          .split(",")
          .map((o) => o.trim())
          .filter(Boolean)
      )
    : new Set([]);
  const __ = typeof optsStr === "string" ? getApp__() : (s) => s;
  return typeof optsStr === "string"
    ? optsStr
        .split(",")
        .map((o) => o.trim())
        .filter((o) => eqStr(v, o) || !exclude_values.has(o))
        .map((o) =>
          option(
            { value: text_attr(o), ...(eqStr(v, o) && { selected: true }) },
            __(text_attr(o))
          )
        )
    : optsStr.map((o, ix) =>
        o?.optgroup
          ? optgroup(
              { label: o.label },
              o.options.map((oi) =>
                option(
                  {
                    selected: v == or_if_undefined(oi.value, oi),
                    value: or_if_undefined(oi.value, oi),
                  },
                  or_if_undefined(oi.label, oi)
                )
              )
            )
          : o && typeof o.name !== "undefined" && typeof o.label !== "undefined"
            ? option(
                {
                  value: o.name,
                  ...((eqStr(v, o.name) ||
                    (ix === 0 && typeof v === "undefined" && o.disabled)) && {
                    selected: true,
                  }),
                  ...(o.disabled && { disabled: true }),
                },
                o.label
              )
            : option({ value: o, ...(eqStr(v, o) && { selected: true }) }, o)
      );
}
@param {string} v
@param {string} optsStr
@returns {string[]}