feat: add single click mode (#1139)
							parent
							
								
									10e399b3c3
								
							
						
					
					
						commit
						e8b4e9af46
					
				| 
						 | 
					@ -145,6 +145,7 @@ func printSettings(ser *settings.Server, set *settings.Settings, auther auth.Aut
 | 
				
			||||||
	fmt.Fprintf(w, "\tScope:\t%s\n", set.Defaults.Scope)
 | 
						fmt.Fprintf(w, "\tScope:\t%s\n", set.Defaults.Scope)
 | 
				
			||||||
	fmt.Fprintf(w, "\tLocale:\t%s\n", set.Defaults.Locale)
 | 
						fmt.Fprintf(w, "\tLocale:\t%s\n", set.Defaults.Locale)
 | 
				
			||||||
	fmt.Fprintf(w, "\tView mode:\t%s\n", set.Defaults.ViewMode)
 | 
						fmt.Fprintf(w, "\tView mode:\t%s\n", set.Defaults.ViewMode)
 | 
				
			||||||
 | 
						fmt.Fprintf(w, "\tSingle Click:\t%t\n", set.Defaults.SingleClick)
 | 
				
			||||||
	fmt.Fprintf(w, "\tCommands:\t%s\n", strings.Join(set.Defaults.Commands, " "))
 | 
						fmt.Fprintf(w, "\tCommands:\t%s\n", strings.Join(set.Defaults.Commands, " "))
 | 
				
			||||||
	fmt.Fprintf(w, "\tSorting:\n")
 | 
						fmt.Fprintf(w, "\tSorting:\n")
 | 
				
			||||||
	fmt.Fprintf(w, "\t\tBy:\t%s\n", set.Defaults.Sorting.By)
 | 
						fmt.Fprintf(w, "\t\tBy:\t%s\n", set.Defaults.Sorting.By)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -302,8 +302,9 @@ func quickSetup(flags *pflag.FlagSet, d pythonData) {
 | 
				
			||||||
		Signup:        false,
 | 
							Signup:        false,
 | 
				
			||||||
		CreateUserDir: false,
 | 
							CreateUserDir: false,
 | 
				
			||||||
		Defaults: settings.UserDefaults{
 | 
							Defaults: settings.UserDefaults{
 | 
				
			||||||
			Scope:  ".",
 | 
								Scope:       ".",
 | 
				
			||||||
			Locale: "en",
 | 
								Locale:      "en",
 | 
				
			||||||
 | 
								SingleClick: false,
 | 
				
			||||||
			Perm: users.Permissions{
 | 
								Perm: users.Permissions{
 | 
				
			||||||
				Admin:    false,
 | 
									Admin:    false,
 | 
				
			||||||
				Execute:  true,
 | 
									Execute:  true,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -27,15 +27,16 @@ var usersCmd = &cobra.Command{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func printUsers(usrs []*users.User) {
 | 
					func printUsers(usrs []*users.User) {
 | 
				
			||||||
	w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0)
 | 
						w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0)
 | 
				
			||||||
	fmt.Fprintln(w, "ID\tUsername\tScope\tLocale\tV. Mode\tAdmin\tExecute\tCreate\tRename\tModify\tDelete\tShare\tDownload\tPwd Lock")
 | 
						fmt.Fprintln(w, "ID\tUsername\tScope\tLocale\tV. Mode\tS.Click\tAdmin\tExecute\tCreate\tRename\tModify\tDelete\tShare\tDownload\tPwd Lock")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for _, u := range usrs {
 | 
						for _, u := range usrs {
 | 
				
			||||||
		fmt.Fprintf(w, "%d\t%s\t%s\t%s\t%s\t%t\t%t\t%t\t%t\t%t\t%t\t%t\t%t\t%t\t\n",
 | 
							fmt.Fprintf(w, "%d\t%s\t%s\t%s\t%s\t%t\t%t\t%t\t%t\t%t\t%t\t%t\t%t\t%t\t%t\t\n",
 | 
				
			||||||
			u.ID,
 | 
								u.ID,
 | 
				
			||||||
			u.Username,
 | 
								u.Username,
 | 
				
			||||||
			u.Scope,
 | 
								u.Scope,
 | 
				
			||||||
			u.Locale,
 | 
								u.Locale,
 | 
				
			||||||
			u.ViewMode,
 | 
								u.ViewMode,
 | 
				
			||||||
 | 
								u.SingleClick,
 | 
				
			||||||
			u.Perm.Admin,
 | 
								u.Perm.Admin,
 | 
				
			||||||
			u.Perm.Execute,
 | 
								u.Perm.Execute,
 | 
				
			||||||
			u.Perm.Create,
 | 
								u.Perm.Create,
 | 
				
			||||||
| 
						 | 
					@ -75,6 +76,7 @@ func addUserFlags(flags *pflag.FlagSet) {
 | 
				
			||||||
	flags.String("scope", ".", "scope for users")
 | 
						flags.String("scope", ".", "scope for users")
 | 
				
			||||||
	flags.String("locale", "en", "locale for users")
 | 
						flags.String("locale", "en", "locale for users")
 | 
				
			||||||
	flags.String("viewMode", string(users.ListViewMode), "view mode for users")
 | 
						flags.String("viewMode", string(users.ListViewMode), "view mode for users")
 | 
				
			||||||
 | 
						flags.Bool("singleClick", false, "use single clicks only")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func getViewMode(flags *pflag.FlagSet) users.ViewMode {
 | 
					func getViewMode(flags *pflag.FlagSet) users.ViewMode {
 | 
				
			||||||
| 
						 | 
					@ -95,6 +97,8 @@ func getUserDefaults(flags *pflag.FlagSet, defaults *settings.UserDefaults, all
 | 
				
			||||||
			defaults.Locale = mustGetString(flags, flag.Name)
 | 
								defaults.Locale = mustGetString(flags, flag.Name)
 | 
				
			||||||
		case "viewMode":
 | 
							case "viewMode":
 | 
				
			||||||
			defaults.ViewMode = getViewMode(flags)
 | 
								defaults.ViewMode = getViewMode(flags)
 | 
				
			||||||
 | 
							case "singleClick":
 | 
				
			||||||
 | 
								defaults.SingleClick = mustGetBool(flags, flag.Name)
 | 
				
			||||||
		case "perm.admin":
 | 
							case "perm.admin":
 | 
				
			||||||
			defaults.Perm.Admin = mustGetBool(flags, flag.Name)
 | 
								defaults.Perm.Admin = mustGetBool(flags, flag.Name)
 | 
				
			||||||
		case "perm.execute":
 | 
							case "perm.execute":
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -41,17 +41,19 @@ options you want to change.`,
 | 
				
			||||||
		checkErr(err)
 | 
							checkErr(err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		defaults := settings.UserDefaults{
 | 
							defaults := settings.UserDefaults{
 | 
				
			||||||
			Scope:    user.Scope,
 | 
								Scope:       user.Scope,
 | 
				
			||||||
			Locale:   user.Locale,
 | 
								Locale:      user.Locale,
 | 
				
			||||||
			ViewMode: user.ViewMode,
 | 
								ViewMode:    user.ViewMode,
 | 
				
			||||||
			Perm:     user.Perm,
 | 
								SingleClick: user.SingleClick,
 | 
				
			||||||
			Sorting:  user.Sorting,
 | 
								Perm:        user.Perm,
 | 
				
			||||||
			Commands: user.Commands,
 | 
								Sorting:     user.Sorting,
 | 
				
			||||||
 | 
								Commands:    user.Commands,
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		getUserDefaults(flags, &defaults, false)
 | 
							getUserDefaults(flags, &defaults, false)
 | 
				
			||||||
		user.Scope = defaults.Scope
 | 
							user.Scope = defaults.Scope
 | 
				
			||||||
		user.Locale = defaults.Locale
 | 
							user.Locale = defaults.Locale
 | 
				
			||||||
		user.ViewMode = defaults.ViewMode
 | 
							user.ViewMode = defaults.ViewMode
 | 
				
			||||||
 | 
							user.SingleClick = defaults.SingleClick
 | 
				
			||||||
		user.Perm = defaults.Perm
 | 
							user.Perm = defaults.Perm
 | 
				
			||||||
		user.Commands = defaults.Commands
 | 
							user.Commands = defaults.Commands
 | 
				
			||||||
		user.Sorting = defaults.Sorting
 | 
							user.Sorting = defaults.Sorting
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,8 +6,8 @@
 | 
				
			||||||
  @dragstart="dragStart"
 | 
					  @dragstart="dragStart"
 | 
				
			||||||
  @dragover="dragOver"
 | 
					  @dragover="dragOver"
 | 
				
			||||||
  @drop="drop"
 | 
					  @drop="drop"
 | 
				
			||||||
  @click="click"
 | 
					  @click="itemClick"
 | 
				
			||||||
  @dblclick="open"
 | 
					  @dblclick="dblclick"
 | 
				
			||||||
  @touchstart="touchstart"
 | 
					  @touchstart="touchstart"
 | 
				
			||||||
  :data-dir="isDir"
 | 
					  :data-dir="isDir"
 | 
				
			||||||
  :aria-label="name"
 | 
					  :aria-label="name"
 | 
				
			||||||
| 
						 | 
					@ -47,7 +47,7 @@ export default {
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  props: ['name', 'isDir', 'url', 'type', 'size', 'modified', 'index'],
 | 
					  props: ['name', 'isDir', 'url', 'type', 'size', 'modified', 'index'],
 | 
				
			||||||
  computed: {
 | 
					  computed: {
 | 
				
			||||||
    ...mapState(['selected', 'req', 'user', 'jwt']),
 | 
					    ...mapState(['user', 'selected', 'req', 'user', 'jwt']),
 | 
				
			||||||
    ...mapGetters(['selectedCount']),
 | 
					    ...mapGetters(['selectedCount']),
 | 
				
			||||||
    isSelected () {
 | 
					    isSelected () {
 | 
				
			||||||
      return (this.selected.indexOf(this.index) !== -1)
 | 
					      return (this.selected.indexOf(this.index) !== -1)
 | 
				
			||||||
| 
						 | 
					@ -170,8 +170,12 @@ export default {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      action(overwrite, rename)
 | 
					      action(overwrite, rename)
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    itemClick: function(event) {
 | 
				
			||||||
 | 
					      if (this.user.singleClick && !this.$store.state.multiple) this.open()
 | 
				
			||||||
 | 
					      else this.click(event)
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    click: function (event) {
 | 
					    click: function (event) {
 | 
				
			||||||
      if (this.selectedCount !== 0) event.preventDefault()
 | 
					      if (!this.user.singleClick && this.selectedCount !== 0) event.preventDefault()
 | 
				
			||||||
      if (this.$store.state.selected.indexOf(this.index) !== -1) {
 | 
					      if (this.$store.state.selected.indexOf(this.index) !== -1) {
 | 
				
			||||||
        this.removeSelected(this.index)
 | 
					        this.removeSelected(this.index)
 | 
				
			||||||
        return
 | 
					        return
 | 
				
			||||||
| 
						 | 
					@ -198,9 +202,12 @@ export default {
 | 
				
			||||||
        return
 | 
					        return
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if (!event.ctrlKey && !this.$store.state.multiple) this.resetSelected()
 | 
					      if (!this.user.singleClick && !event.ctrlKey && !this.$store.state.multiple) this.resetSelected()
 | 
				
			||||||
      this.addSelected(this.index)
 | 
					      this.addSelected(this.index)
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    dblclick: function () {
 | 
				
			||||||
 | 
					      if (!this.user.singleClick) this.open()
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    touchstart () {
 | 
					    touchstart () {
 | 
				
			||||||
      setTimeout(() => {
 | 
					      setTimeout(() => {
 | 
				
			||||||
        this.touches = 0
 | 
					        this.touches = 0
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -24,6 +24,10 @@
 | 
				
			||||||
      <input type="checkbox" :disabled="user.perm.admin" v-model="user.lockPassword"> {{ $t('settings.lockPassword') }}
 | 
					      <input type="checkbox" :disabled="user.perm.admin" v-model="user.lockPassword"> {{ $t('settings.lockPassword') }}
 | 
				
			||||||
    </p>
 | 
					    </p>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <p>
 | 
				
			||||||
 | 
					      <input type="checkbox" v-model="user.singleClick"> {{ $t('settings.singleClick') }}
 | 
				
			||||||
 | 
					    </p>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <permissions :perm.sync="user.perm" />
 | 
					    <permissions :perm.sync="user.perm" />
 | 
				
			||||||
    <commands v-if="isExecEnabled" :commands.sync="user.commands" />
 | 
					    <commands v-if="isExecEnabled" :commands.sync="user.commands" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -174,6 +174,7 @@
 | 
				
			||||||
    "globalRules": "This is a global set of allow and disallow rules. They apply to every user. You can define specific rules on each user's settings to override this ones.",
 | 
					    "globalRules": "This is a global set of allow and disallow rules. They apply to every user. You can define specific rules on each user's settings to override this ones.",
 | 
				
			||||||
    "allowSignup": "Allow users to signup",
 | 
					    "allowSignup": "Allow users to signup",
 | 
				
			||||||
    "createUserDir": "Auto create user home dir while adding new user",
 | 
					    "createUserDir": "Auto create user home dir while adding new user",
 | 
				
			||||||
 | 
					    "singleClick": "Use single clicks to open files and directories",
 | 
				
			||||||
    "insertRegex": "Insert regex expression",
 | 
					    "insertRegex": "Insert regex expression",
 | 
				
			||||||
    "insertPath": "Insert the path",
 | 
					    "insertPath": "Insert the path",
 | 
				
			||||||
    "userUpdated": "User updated!",
 | 
					    "userUpdated": "User updated!",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -23,6 +23,7 @@ type userInfo struct {
 | 
				
			||||||
	ID           uint              `json:"id"`
 | 
						ID           uint              `json:"id"`
 | 
				
			||||||
	Locale       string            `json:"locale"`
 | 
						Locale       string            `json:"locale"`
 | 
				
			||||||
	ViewMode     users.ViewMode    `json:"viewMode"`
 | 
						ViewMode     users.ViewMode    `json:"viewMode"`
 | 
				
			||||||
 | 
						SingleClick  bool              `json:"singleClick"`
 | 
				
			||||||
	Perm         users.Permissions `json:"perm"`
 | 
						Perm         users.Permissions `json:"perm"`
 | 
				
			||||||
	Commands     []string          `json:"commands"`
 | 
						Commands     []string          `json:"commands"`
 | 
				
			||||||
	LockPassword bool              `json:"lockPassword"`
 | 
						LockPassword bool              `json:"lockPassword"`
 | 
				
			||||||
| 
						 | 
					@ -173,6 +174,7 @@ func printToken(w http.ResponseWriter, _ *http.Request, d *data, user *users.Use
 | 
				
			||||||
			ID:           user.ID,
 | 
								ID:           user.ID,
 | 
				
			||||||
			Locale:       user.Locale,
 | 
								Locale:       user.Locale,
 | 
				
			||||||
			ViewMode:     user.ViewMode,
 | 
								ViewMode:     user.ViewMode,
 | 
				
			||||||
 | 
								SingleClick:  user.SingleClick,
 | 
				
			||||||
			Perm:         user.Perm,
 | 
								Perm:         user.Perm,
 | 
				
			||||||
			LockPassword: user.LockPassword,
 | 
								LockPassword: user.LockPassword,
 | 
				
			||||||
			Commands:     user.Commands,
 | 
								Commands:     user.Commands,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -11,6 +11,7 @@ type UserDefaults struct {
 | 
				
			||||||
	Scope        string            `json:"scope"`
 | 
						Scope        string            `json:"scope"`
 | 
				
			||||||
	Locale       string            `json:"locale"`
 | 
						Locale       string            `json:"locale"`
 | 
				
			||||||
	ViewMode     users.ViewMode    `json:"viewMode"`
 | 
						ViewMode     users.ViewMode    `json:"viewMode"`
 | 
				
			||||||
 | 
						SingleClick  bool              `json:"singleClick"`
 | 
				
			||||||
	Sorting      files.Sorting     `json:"sorting"`
 | 
						Sorting      files.Sorting     `json:"sorting"`
 | 
				
			||||||
	Perm         users.Permissions `json:"perm"`
 | 
						Perm         users.Permissions `json:"perm"`
 | 
				
			||||||
	Commands     []string          `json:"commands"`
 | 
						Commands     []string          `json:"commands"`
 | 
				
			||||||
| 
						 | 
					@ -22,6 +23,7 @@ func (d *UserDefaults) Apply(u *users.User) {
 | 
				
			||||||
	u.Scope = d.Scope
 | 
						u.Scope = d.Scope
 | 
				
			||||||
	u.Locale = d.Locale
 | 
						u.Locale = d.Locale
 | 
				
			||||||
	u.ViewMode = d.ViewMode
 | 
						u.ViewMode = d.ViewMode
 | 
				
			||||||
 | 
						u.SingleClick = d.SingleClick
 | 
				
			||||||
	u.Perm = d.Perm
 | 
						u.Perm = d.Perm
 | 
				
			||||||
	u.Sorting = d.Sorting
 | 
						u.Sorting = d.Sorting
 | 
				
			||||||
	u.Commands = d.Commands
 | 
						u.Commands = d.Commands
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -28,6 +28,7 @@ type User struct {
 | 
				
			||||||
	Locale       string        `json:"locale"`
 | 
						Locale       string        `json:"locale"`
 | 
				
			||||||
	LockPassword bool          `json:"lockPassword"`
 | 
						LockPassword bool          `json:"lockPassword"`
 | 
				
			||||||
	ViewMode     ViewMode      `json:"viewMode"`
 | 
						ViewMode     ViewMode      `json:"viewMode"`
 | 
				
			||||||
 | 
						SingleClick  bool          `json:"singleClick"`
 | 
				
			||||||
	Perm         Permissions   `json:"perm"`
 | 
						Perm         Permissions   `json:"perm"`
 | 
				
			||||||
	Commands     []string      `json:"commands"`
 | 
						Commands     []string      `json:"commands"`
 | 
				
			||||||
	Sorting      files.Sorting `json:"sorting"`
 | 
						Sorting      files.Sorting `json:"sorting"`
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue