diff --git a/.github/workflows/deploy.yml b/.github/workflows/mol.yml similarity index 76% rename from .github/workflows/deploy.yml rename to .github/workflows/mol.yml index 6e0b7fb043b..985fe8e14a5 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/mol.yml @@ -1,4 +1,4 @@ -name: Deploy +name: $mol on: workflow_dispatch: @@ -42,12 +42,12 @@ jobs: if: github.ref == 'refs/heads/master' runs-on: ubuntu-latest steps: - - env: - GITHUB_TOKEN: ${{ secrets.GH_PAT }} - INPUTS_CLIENT_PAYLOAD: '{"repository":${{ toJson(github.event.repository.name) }}}' - INPUTS_EVENT_TYPE: dependency_changed - INPUTS_REPOSITORY: ${{ matrix.repo }} - uses: rekgrpth/github-repository-dispatch-shell-action@v1 + - uses: peter-evans/repository-dispatch@v3 + with: + token: ${{ secrets.GH_PAT }} + repository: ${{ matrix.repo }} + event-type: dependency_changed + client-payload: '{"repository":${{ toJson(github.event.repository.name) }}}' strategy: matrix: repo: diff --git a/format/format.view.ts b/format/format.view.ts index faf0eeb903e..a61ba819fa5 100644 --- a/format/format.view.ts +++ b/format/format.view.ts @@ -19,8 +19,11 @@ namespace $.$$ { const mask = this.mask( filtered ) if( ( prev?.[0] ?? 0 ) >= from ) return [ from, to ] - - const lastAllow = ( value.length - [ ... value ].reverse().findIndex( letter => allow.includes( letter ) ) )%(value.length+1) + + const lastAllow = ( + value.length - [ ... value ].reverse().findIndex( letter => allow.includes( letter ) ) + ) % ( value.length + 1 ) + if( lastAllow < from ) { from = to = lastAllow } @@ -29,7 +32,7 @@ namespace $.$$ { ++ from ++ to } - + return [ from, to ] } diff --git a/number/number.view.ts b/number/number.view.ts index 90285bbf3d5..ba3e2a7d6e2 100644 --- a/number/number.view.ts +++ b/number/number.view.ts @@ -7,7 +7,7 @@ namespace $.$$ { export class $mol_number extends $.$mol_number { value_limited( val? : number ) : number { - if (Number.isNaN( val )) return this.value(val) + if (Number.isNaN( val )) return this.value( val ) if ( val === undefined ) return this.value() const min = this.value_min() @@ -27,34 +27,70 @@ namespace $.$$ { this.value_limited( ( this.value_limited() || 0 ) + this.precision_change() ) } - value_normalized(next?: string) { - const next_num = this.value_limited( next === undefined ? next : Number(next) ) - - if (Number.isNaN(next_num)) return '' + round(val: number) { + if (Number.isNaN(val)) return '' + if( val === 0 ) return '0' + if( !val ) return '' const precision_view = this.precision_view() - if( next_num === 0 ) return '0' - if( !next_num ) return '' + if (! precision_view) return val.toFixed() if( precision_view >= 1 ) { - return ( next_num / precision_view ).toFixed() + return ( val / precision_view ).toFixed() } else { const fixed_number = Math.log10( 1 / precision_view ) - return next_num.toFixed( Math.ceil( fixed_number ) ) + return val.toFixed( Math.ceil( fixed_number ) ) } } - + @ $mol_mem - override value_string( next? : string ) { - const current = this.value_normalized() + override value_string( next? : string ): string { + // Вытягиваем value + // Если кто-то поменяет из вне value, value_string надо обновить + const current = this.round( this.value_limited() ) + if (next === undefined) return current + + const precision = this.precision_view() - if ( next !== undefined) this.value_normalized( next ) + // Точку в конце поставить нельзя, если precision_view целое число > 0 + if ( precision - Math.floor(precision) === 0 ) next = next.replace(/[.,]/g, '') - return next ?? current + // Запятые меняем на точки, удаляем не-цифры и не-точки и лишние ноли в начале целой части. + // Минус получится ввести только в начале. + next = (this.value_min() < 0 && next.startsWith('-') ? '-' : '') + + next.replace(/,/g, '.').replace(/[^\d\.]/g, '').replace(/^0{2,}/, '0') + let dot_pos = next.indexOf('.') + + if (dot_pos !== -1) { + const prev = $mol_wire_probe(() => this.value_string()) ?? '' + const dot_pos_prev = prev.indexOf('.') + // Определяем где относительно предыдущей точки юзер поставил новую + if (dot_pos_prev === dot_pos) dot_pos = next.lastIndexOf('.') + + // Из частей до и после новой точки старую точку удаляем + const frac = next.slice(dot_pos + 1).replace(/\./g, '') + + // Если точка идет первой, перед ней пишем 0, что бы форматирование выглядело нормально в mask + next = (next.slice(0, dot_pos) || '0').replace(/\./g, '') + '.' + frac + } + + // Оставляем старое значение в value есть сочетание, приводящие к NaN, например -. + if ( Number.isNaN(Number(next)) ) return next + + if ( next.endsWith('.') ) return next + if ( next.endsWith('-') ) return next + + // Если пустая строка - сетим NaN + // Применяем округления. + this.value_limited(Number(next || Number.NaN)) + + // Возвращаем все-равно не нормализованное значение + // Иначе нельзя ввести будет 10, если min/max 5..10 + return next } - + @ $mol_mem override dec_enabled() : boolean { return this.enabled() && ( diff --git a/page/page.view.tree b/page/page.view.tree index d383c52e94d..efbe615a1c8 100644 --- a/page/page.view.tree +++ b/page/page.view.tree @@ -1,6 +1,6 @@ $mol_page $mol_view dom_name \article - field * + attr * ^ tabIndex <= tabindex -1 sub /