1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- import {readdir, stat} from 'node:fs/promises'
- import path from 'node:path'
- import {compare as naturalCompare} from 'natural-orderby'
- import {Button, ListScrollForm} from 'tui-lib/ui/controls'
- export default class FilePickerForm extends ListScrollForm {
- fillItems(dirPath) {
- this.inputs = []
- this.children = []
- const button = new Button('..Loading..')
- this.addInput(button)
- this.firstInput(false)
- readdir(dirPath).then(
- async items => {
- this.removeInput(button)
- const processedItems = await Promise.all(items.map(item => {
- const itemPath = path.resolve(dirPath, item)
- return stat(itemPath).then(s => {
- return {
- path: itemPath,
- label: item + (s.isDirectory() ? '/' : ''),
- isDirectory: s.isDirectory()
- }
- })
- }))
- const compare = naturalCompare()
- processedItems.sort((a, b) => {
- if (a.isDirectory === b.isDirectory) {
- return compare(a.label, b.label)
- } else {
- if (a.isDirectory) {
- return -1
- } else {
- return +1
- }
- }
- })
- processedItems.unshift({
- path: path.resolve(dirPath, '..'),
- label: '../',
- isDirectory: true
- })
- let y = 0
- for (const item of processedItems) {
- const itemButton = new Button(item.label)
- itemButton.y = y
- y++
- this.addInput(itemButton)
- itemButton.on('pressed', () => {
- if (item.isDirectory) {
- this.emit('browsingDirectory', item.path)
- this.fillItems(item.path)
- } else {
- this.emit('selected', item.path)
- }
- })
- }
- console.log('HALLO.', false)
- this.firstInput(false)
- this.fixLayout()
- },
- () => {
- button.text = 'Failed to read path! (Cancel)'
- button.on('pressed', () => {
- this.emit('canceled')
- })
- })
- }
- }
|