[GEN] SortInventory v1.4.1 - Sort and stack your inventory [Spout] [Permissions] [1060]

Discussion in 'Inactive/Unsupported Plugins' started by Gabriel333, Aug 13, 2011.

  1. Offline

    Gabriel333

    SortInventory - Sort and stack inventories.
    Version: 1.4.1

    OBS: I have started my next generation of my plugin and changed the name to BukkitInventoryTools. I have made a Digital Lock for your inventories in BikkitInventoryTools. From now I will only make bugfix on SortInventory if there is any errors left.

    This is a little and useful utility which can stack and sort the players inventory, a chest inventory and doublechest inventory.

    Command: If you have SpoutCraft you just open the inventory and press Hotkey S
    If you don't have SpoutCraft you point at a chest and type /sort to stack and sort the items in the chest. Point anywhere else and type /sort to stack and sort the player inventory.

    Example before and after using Sort.
    [​IMG]

    Features:
    • SortInventory now also support SpoutBackpack. Open the backpack and press "S".
    • Does not stack tools, food, armor and vehicles in the first line in the players inventory
    • Uses PermissionsBukkit 1.1/Permissions 3.1.6/PermissionsEx 1.13 - if installed. Superperms is not tested. Is anybody using it?
    • Uses SpoutCraft for notifications, but SortInventory works also with MineCraft.
    • Stack all types of items
      • Permissions nodes so you decide which items can be stacked per. user.
    • Configurable Hotkey (see config.yml)
    • Configurable sort-order of all items (see config.yml)
    Download: http://dl.dropbox.com/u/36067670/SortInventory/SortInventory.jar

    Source:http://dl.dropbox.com/u/36067670/SortInventory/SortInventory.zip

    Depend:
    SortInventory depends on Spout on the server.

    To do:
    • Automatically create missing parameters in config.yml Done V1.2
    • User request: Implement activation by keystrokes (Configurable)...... Done! V1.1
    • Implement a configurable way of sorting in the config.yml. Done V1.2.5
    • User request: Integration to other inventories like SpoutBackpack.... Done! V1.2
    • User request: Implement permissionsnodes to specify which items the users can stack..... Done! V1.1.7
    • User request: Use the mouse to sort (like Hotkey S)
    • Integration to MyWolf's inventory.
    • Admins can configure which items in the 5 groups in config.yml Implemented in BukkitInventoryTools 2.0
    • User request: replace used item in slot 0-8, if they exist in slot 9-27. Like swords and food.
    Known bugs:

    • none
    Changelog:
    Version 1.4.1
    Version 1.4
    • Sort on Doublechests works now. I found some new features in Spout, which made it possible to use same stack and sort method, as I used one the player inventory, singlechest and SpoutBackpack Inventory.
    Version 1.3.1

    • Minor fix. I have just removed some "spam" messages in the console, which i made while I was trying to make Button to work and integration to MyWolf.
    • Permissions in plygin.yml is changed so
    Show Spoiler


    Version 1.3
    • Cleaned up the Permissions Class.
    • Integration to MyWolf has begun.
    Version 1.2.9
    • Bugfix: PermissionsEx didn't work, if PermissionsEx's bridge were loaded too!
    • Plugin.yml, now contain default permissions (OP). (Thanks to feildmaster for his tip)
    Show Spoiler


    Code:
    permissions:
        sortinventory.use:
            default: op
        sortinventory.stack.tools:
            default: op
        sortinventory.stack.armor:
            default: op
        sortinventory.stack.weapons:
            default: op
        sortinventory.stack.food:
            default: op
        sortinventory.stack.vehicles:
            default: op


    Version 1.2.8
    • PermissionsEx fixed and tested on my testserver. OP, PermissionsBukkit, Permissions 3.1.6 and PermissionsEx 1.13 has been tested and works now.
    Version 1.2.7

    • Reprogramming the order algorithm. Now its faster.
    • Sort on doublechest's works better, but NOT perfect. Stacking works, but order algorithm does not.
    Version 1.2.6

    • Small bugfix.
    Version 1.2.5

    • Sort-order can now be specified in config.yml
    Version 1.2.2

    • SortInventory now supports PermissionEx 1.13
    Version 1.2.1

    • small fix on version 1.2. Version 1.2 broke the sort-feature on the normal playerinventory. fixed.
    Version 1.2

    • SortInventory now works on SpoutBackpack, so you can sort/stack the backpack too.
    Version 1.1.9

    • Error when Config.yml was not up to date. fixed. It made the client crash.
    Version 1.1.8

    • Hotkey can only be used when player inventory or chest inventory is open.
    Version 1.1.7

    • Added permissionnodes to specifi which items the users can stack.
    Version 1.1.6

    • Made a small fix, which I hope will remove the error:
      [GRAVE] Could pass event CUSTOM_EVENT to SortInventory...
    Version 1.1.5

    • Bug: Users reported items lost, when sorting. Fixed.
    Version 1.1.4

    • Bug: Users reported items lost, when sorting. Fixed.
    Version 1.1.1

    • Bug: OP has no permissions. Fixed.
    Version 1.1

    • Implementet an configurable Hotkey. OBS. Delete the config.yml to get a new one.
    Version 1.0.1

    • Fixed minor bug in sendNotification class.
    Version 1.0

    • First release - my first plugin


    Permissions:
    The Users/Usergroups should have these permissions set
    Show Spoiler

    PermissionsBukkit
    sortinventory.use: true
    sortinventory.stack.tools: true
    sortinventory.stack.armor: true
    sortinventory.stack.weapons: true
    sortinventory.stack.food: false
    sortinventory.stack.vehicles: true
    or
    sortinventory.stack.*: true

    Permissions 3.1.6 and PermissionsEx 1.13
    - 'sortinventory.use'
    - 'sortinventory.stack.tools'
    - 'sortinventory.stack.armor'
    - 'sortinventory.stack.weapons'
    - 'sortinventory.stack.food'
    - 'sortinventory.stack.vehicles'
    or
    - 'sortinventory.stack.*'
    If you dont have a permission system
    Users will only have access to
    sortinventory.use
    OP will have acess to
    sortinventory.stack.armor: true
    sortinventory.stack.tools: true
    sortinventory.stack.weapons: true
    sortinventory.stack.food: true
    sortinventory.stack.vehicles: true
     
  2. Offline

    d00ba

    Works well, thanks! xD
     
  3. Offline

    jycs

    error...
    again error, and error.
     
  4. Offline

    Taranis01

    @Gabriel333
    i would suggest to use the mouse middle click instead of S as hotkey (or both, configure-able)
     
  5. Offline

    Gabriel333

    I have not tried to use the mouse yet, but I agree using the mouse would be easier. I had thought about making a button to click on, to sort/stack the inventory. I will see what I can do. I have put it on my todo list!

    I have just released a version where i support SpoutBackpack too! So it is possible to sort the items in the backpack. :)

    SortInventory v 1.2 now supports SpoutBackpack v 1.9.5 :) NeatMonster made an API so I can sort his inventory!

    Update both plugins to make it work! :)

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: May 18, 2016
    Taranis01 likes this.
  6. Offline

    meizme

    I get the '[Severe] Could not pass event CUSTOM_EVENT to SortInventory' thing as well with all acounts including admins with * permissions.


    2011-08-19 22:57:41 [SEVERE] Could not pass event CUSTOM_EVENT to SortInventory
    java.lang.NullPointerException
    at org.bukkit.material.SimpleAttachableMaterialData.getFacing(SimpleAttachableMaterialData.java:38)
    at org.bukkit.material.SimpleAttachableMaterialData.toString(SimpleAttachableMaterialData.java:43)
    at java.lang.String.valueOf(Unknown Source)
    at java.lang.StringBuilder.append(Unknown Source)
    at dk.gabriel333.SortInventory.SortInventoryCommand.moveitem(SortInventoryCommand.java:192)
    at dk.gabriel333.SortInventory.SortPlayerInventory.sortinventory(SortPlayerInventory.java:26)
    at dk.gabriel333.SortInventory.KeyListener.onKeyPressedEvent(KeyListener.java:48)
    at org.getspout.spoutapi.event.input.InputListener.onCustomEvent(InputListener.java:28)
    at org.bukkit.plugin.java.JavaPluginLoader$88.execute(JavaPluginLoader.java:862)
    at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:58)
    at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:338)
    at org.getspout.spoutapi.packet.PacketKeyPress.run(PacketKeyPress.java:54)
    at org.getspout.spout.packet.CustomPacket.a(CustomPacket.java:99)
    at net.minecraft.server.NetworkManager.b(NetworkManager.java:226)
    at net.minecraft.server.NetServerHandler.a(NetServerHandler.java:89)
    at org.getspout.spout.SpoutNetServerHandler.a(SpoutNetServerHandler.java:436)
    at net.minecraft.server.NetworkListenThread.a(SourceFile:105)
    at net.minecraft.server.MinecraftServer.h(MinecraftServer.java:454)
    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:363)
    at net.minecraft.server.ThreadServerApplication.run(SourceFile:422)

    I deleted the whole folder and redownloaded and it recreated the config, but still doesnt work.
     
  7. Offline

    Gabriel333

    I look at it right away. I have two questions. Please check if you are using the newest version (1.2) and then tell me if the parameter Debug.SortInventory in config.yml is set to true?
    You should not reach line 192 in Sortinventory unless the debug parm is true and you dont need that.
    at dk.gabriel333.SortInventory.SortInventoryCommand.moveitem(SortInventoryCommand.java:192)

    EDIT: i know what the error is. you dont need to do anything for now. I made an integration for SpoutBackpack last night, and i forgot to test the sort algorithm on the normal playerinventory (sorry)


    EDIT 2: Fixed in version 1.2.1

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: May 18, 2016
  8. Offline

    lipe123

    Please add chest sorting! I must have clicked wrong, works now. Is it written in the features?

    Will this read permissionsex as bukkitperms?

    Ps. Stacking food is awesome i <3 you (no homo)
     
  9. Offline

    Gabriel333

    Hmm. It wasnt my plan to implement permissionsex. I think that Permission plugins which use the new bukkit build in permission API is the future. (like PermissionsBukkit).

    I have to taskes which i think is more important that implement permissionsex.
    • Implement a GUI button to sort (instead of a hotkey)
    • configurable sort sequence (server admin feture)
    But okay I will have a quick look on the documentation of permissionsex to see is looks easy.


    EDIT: PermissionsEx will be supported in next release (it was easy) :) But I have not tested much, so you will have to do the testing. :p

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: May 18, 2016
  10. Offline

    meizme

    thnx, your on the ball ^.~

    dang it man... still throwing an error
    im using spoutcraft 1.0.2.165 and spout 1.0.2:134

    here's my config
    Show Spoiler

    ############################################################
    # +------------------------------------------------------+ #
    # | Plugin configuration file for SortInventory | #
    # | | #
    # | | #
    # +------------------------------------------------------+ #
    ############################################################

    ############################################################
    # +------------------------------------------------------+ #
    # | General | #
    # +------------------------------------------------------+ #
    ############################################################
    General:
    # Set Language. Currently supported: EN
    Language: EN

    ############################################################
    # +------------------------------------------------------+ #
    # | Properties for Sort Command | #
    # +------------------------------------------------------+ #
    ############################################################
    Sort:
    # Set the key to activate sort.
    # Deactivate the HOTKEY by setting SortKey: KEY_DEACTIVE
    SortKey: KEY_S
    SortSeq: [1, 2, 3, 4, 5]

    ############################################################
    # +------------------------------------------------------+ #
    # | Properties for Debug | #
    # +------------------------------------------------------+ #
    ############################################################
    Debug:
    Permissions: false
    SortInventory: false
    OnEnable: false
    Keyboard: false


    Here is my plugin list ------------------------------------------------------------

    Show Spoiler

    Blast Control 1.0.6 - Keep creepers and ghasts from destroying our builds
    BOSEconomy 0.7.2 - a Simple economy, earn money per hour. has bank support.
    Blacksmith 1.0.3 - Setup shops to repair tools.
    ChopTree 1.2.4 - Makes Felling Trees a lot more realistic
    Death Control 1.1.3 - Gives our inventory back after death
    Drink 0.3.5 - allows the left click of water and milk to heal players.
    Dynmap 0.21(dev) - Dynamic and real-time map with chat - View here
    FalseBook 0.87-3 - allows for Complex IC's and Working lifts,gates, doors, and bridges.
    InvincibleFences 0.1 - to keep people from getting back into the arenas after death
    LagMeter 0.4.1 - allows the check of lag and memory use.
    LWC Autoupdate- Protected Chests, Doors, and Signs... etc
    MagicSpells 1.0.2 - Cast Spells (healing only ATM)
    MCDocs 10 - MOTD, News, Rules and things like that.
    MobArena 0.94.5(Dev) - allows to scheduled battles in an arena
    Mobspawn Changer 0.2 - Allows for the editing of which mobs pop out of a spawner block OtF
    Mobile admin - Control over the server from any android phone
    ModLoader 1.7.3 - Loads Mods like wildgrass and CTM
    MoveInvintory 0.5.4 - use a command to Dump, Retrieve or Swap your Inv. with a Chest
    NoCheat v1.13 for CraftBukkit RB #1060
    Nocivilspawns 1.4.7 - keeps mobs from spawning in areas like cities and on top trees.
    Noice 1.2 - Stops ice from forming (allowing ice to be shaped, and to keep rivers & lakes flowing)
    PaintingSwitch 0.3 - Mouse wheel scroll through choices of paintings
    PermissionsEX 1.13 - Allows the setting and control of individuals access to Abilities and Mods.
    PortalStick 2.3.3 - adds all portal elements to the game world.
    SuperWheat 0.1 - Makes wheat regrow automatically when harvested, and trample proof.
    Whitelist 2.7 - Only approved names can join the server
    World Border 1.4.1 - limit the map size and set a shape.
    WorldEdit 4.6 - allows Admins to edit "the world"
    -truezip
    -rhino
    WoolSwitch 1.2 - Scroll through wool colors (type /ws to de/activate it)
    Vegetation 3.4.5 - Wild grass, Wild vines, and Wild lilies support (requires client files, link below)

    Spout Mods:
    AmbientSeasons 1.4.3 - Configurable seasons
    Effective Arrows 2.5.2 - Adds a total of 7 types of arrows, Of which we may use 3-4
    Spout 1.0.2 - A dependancy for a few mods
    Spoutcraft - Mods Depend on it
    Spout Demand 1.2 - Boots non-spout users,
    Juke Bukkit v0.4 - make custom music disc's
    Shortcuts 0.2.5 - allows binding of commands to buttons
    MyWolf - 0.4.9c -a pet wolf with mule packs.
    SpoutEssentials 2.7.1 - adds popups for when people login , the ability to poke and music control.
    SpoutBackpack 1.9.1 - Adds additional upgradable inventory space, displays Gil, & mobile Craft table


    and i used my admin account with * permissions, then added the permissions listed manually too.

    heres the error:
    Show Spoiler

    2011-08-20 08:42:55 [SEVERE] Could not pass event CUSTOM_EVENT to SortInventory
    java.lang.NullPointerException
    at dk.gabriel333.SortInventory.Config.isEnabled(Config.java:96)
    at dk.gabriel333.SortInventory.SortInventoryCommand.moveitem(SortInventoryCommand.java:195)
    at dk.gabriel333.SortInventory.SortPlayerInventory.sortinventory(SortPlayerInventory.java:53)
    at dk.gabriel333.SortInventory.KeyListener.onKeyPressedEvent(KeyListener.java:48)
    at org.getspout.spoutapi.event.input.InputListener.onCustomEvent(InputListener.java:28)
    at org.bukkit.plugin.java.JavaPluginLoader$88.execute(JavaPluginLoader.java:862)
    at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:58)
    at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:338)
    at org.getspout.spoutapi.packet.PacketKeyPress.run(PacketKeyPress.java:54)
    at org.getspout.spout.packet.CustomPacket.a(CustomPacket.java:99)
    at net.minecraft.server.NetworkManager.b(NetworkManager.java:226)
    at net.minecraft.server.NetServerHandler.a(NetServerHandler.java:89)
    at org.getspout.spout.SpoutNetServerHandler.a(SpoutNetServerHandler.java:436)
    at net.minecraft.server.NetworkListenThread.a(SourceFile:105)
    at net.minecraft.server.MinecraftServer.h(MinecraftServer.java:454)
    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:363)
    at net.minecraft.server.ThreadServerApplication.run(SourceFile:422)


    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: May 18, 2016
  11. Offline

    ark3typ3

    I'm getting the same error as meizme. Think it has to do with spoutcraft?
     
  12. Offline

    Gabriel333

    Sort order is now is now configurable in config.yml

    Default sort order is alphabetic. What do you suggest should be default?

    I have released version 1.2.5 with alot of fixed. If you still get an error I need the error from the console!


    I have released version 1.2.5 with alot of fixed. If you still get an error I need the error from the console!

    I would appreciate to have some feedback about if PermissionseEx works. :)

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: May 18, 2016
  13. Offline

    lipe123

    I'm uising permissionsEX and it does not seem to work well. I have the "*" permission and it works but my other groups i gave "sortinventory.use" and it does not work for them.
     
  14. Offline

    Gabriel333

    Okay. Could you please send me the permissionfile, so I can do some testing on my own testserver? Im going to bed now, but I will try to look at it tomorrow. :)
     
  15. Offline

    lipe123

    The yml I'm using?
    Sure But I'll cut off the users in it..
    http://pastebin.com/4K2yK3pz

    Remember permissionsex currently exposes 3 permission systems all at once, permissions 2.7.x, permissionsEX, Bukkitperms. Often plugins grab double "handles" I guess would be the best description, could that be the reason?
     
  16. Offline

    Zarius

    I had the same problem - oddly enough just adding the BukkitPermissions plugin without giving any permissions to it allowed the SortInventory to work (but with permissions for any/all players - not just the groups I gave permission to in PermissionsEx).
     
  17. Offline

    lipe123

    Since only I'm able to use it on my server with the '*' permission I've tried to sort the chests of other players and it duped everything in the chest.

    Later I sorted one of my own chests, same thing happened and then the client crashed each time i tried to open the chest.

    In both instances I had to //restore the chest from a backup with worldedit.

    I've really been looking for a plugin like this so I hope it gets sorted soon.

    On a sidenote can you look at the SMP mod called "convenient inventory" It does almost everything your plugin does but also allowes you to craft the max amount of items possible with a shift-click on the result item.
     
  18. Offline

    Gabriel333

    I VERY sorry for the restore you had to make!!! :-( My stack-algorithm works fine, it is the "reorder" of items whic gives me troubles. I promise to works hard to make it work.

    Im also trying to integrate to other "inventories". I started with SpoutBackpack and this works fine, next one is MyWolf - and Im i dialog with the developer in this moment (I need the other developers to make and API - before I can integrate to their inventory).
     
  19. Offline

    Snipe76

    i run server without spout and it says this:

    Code:
    org.bukkit.plugin.UnknownDependencyException: Spout
        at org.bukkit.plugin.java.JavaPluginLoader.loadPlugin(JavaPluginLoader.java:133)
        at org.bukkit.plugin.SimplePluginManager.loadPlugin(SimplePluginManager.java:213)
        at org.bukkit.plugin.SimplePluginManager.loadPlugins(SimplePluginManager.java:136)
        at org.bukkit.craftbukkit.CraftServer.loadPlugins(CraftServer.java:143)
        at org.bukkit.craftbukkit.CraftServer.<init>(CraftServer.java:110)
        at net.minecraft.server.ServerConfigurationManager.<init>(ServerConfigurationManager.java:51)
        at net.minecraft.server.MinecraftServer.init(MinecraftServer.java:133)
        at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:337)
        at net.minecraft.server.ThreadServerApplication.run(SourceFile:422)
     
  20. Offline

    Gabriel333

    Well as i write in the top this plugin depend on Spout.... I cant make this plugin Spout on the server, but you dont need Spout on the Client (SpoutCraft).

    Depend:
    SortInventory depends on Spout on the server.
     
  21. Offline

    MasterPJ

    Hey i dont know if you know this but when i open a double chest and sort it it just keeps multiplying the things in there to the max of 64 (i dont know if you call this duping) and even would stack nonstackable items such as shovels i had to immediately delete your plugin so no one else would abuse it

    Hopefully you fix this soon cause i really liked your plugin
     
  22. Offline

    Gabriel333

    I will fix it... but the doublechest make troubles :) Do you use version 1.2.7?

    Please try again! I have tested 4 permission systems tonight ans seen them work :) In version 1.2.8

    Please try again! I have tested 4 permission systems tonight ans seen them work :) In version 1.2.8



    Please try again! I have tested 4 permission systems tonight ans seen them work :) In version 1.2.8


    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: May 18, 2016
  23. Offline

    MasterPJ

    actual your right i kinda just panicked i didn't try updating to the newest but im sure my verision was download only yesterday so ill try the newest update
     
  24. Offline

    Gabriel333

    I think i have solved the dublication/deleting problem, but the reorder function does not work fully.
     
  25. Offline

    feildmaster

    @Gabriel333 : Seriously? Detecting if using permissions bukkit?

    Don't "default to op." Default to player.hasPermission("node");
    -_-

    Then do the following in plugin.yml: (to default to OP)
    Code:
    permissions:
        sortinventory.use:
            default: op
        sortinventory.stack.tools:
            default: op
        sortinventory.stack.armor:
            default: op
        sortinventory.stack.weapons:
            default: op
        sortinventory.stack.food: 
            default: op
        sortinventory.stack.vehicles:
            default: op
    Takes like... three seconds.
     
    Gabriel333 likes this.
  26. Offline

    bradgillap

    Keep plugging away dude. I'm really excited to implement this mod into our 1.8 rollout.
     
    Gabriel333 likes this.
  27. Offline

    lipe123

    From my log file:
    2011-08-22 23:21:39 [INFO] [SortInventory] Permissions3/SuperpermBridge is detected. Permissions v2.7.7
    2011-08-22 23:21:39 [INFO] [SortInventory] Spout is detected.
    2011-08-22 23:21:39 [INFO] [SortInventory] SortInventory version 1.2.8 is enabled!

    I'm not using permissions 2.7.7 thats PEX's bridge. Still have the same issue I'm NOT op but I have the '*' permission and sorting works great for me. My other users all have the sortinventory.use and sortinventory.stack.* but all of them get "you do not have permission" when try try and press S or enter /sort.

    Funny thing is that it used to work for a while and then just out of nowhere stopped.
     
  28. Offline

    Gabriel333

    Thanks for the tip! I didnt know that (I don't know where I can find the documentation on this?). I will implement it in next release.

    How do I configure permissions in the plugin.yml so everybody can use "sortinventory.use" ? (is it Default: *) or something?

    Hmm...:( When you get this: " Permissions3/SuperpermBridge is detected. " it is because you load a permission plugin like "Permissions.jar" (Permissions 3.1.6) or "SuperPerm.jar" from bridge PermissionsBukkit or it is the "Permissions.jar" then Bridge for PermissionsEx.

    EDIT: Please try versions 1.2.9 I think I found the error. :rolleyes: Last night I didn't test the bridges. There is many combinations to test, when i support 3 permission plugins.

    Thanks :) My next planed feature is that I want to try to add is "Sort", "Stack","Close" buttons to the inventory popup window. And I want to make integration to the MyWolf plugin too. But this will only work for SpoutCraft users.

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: May 18, 2016
  29. Offline

    feildmaster

    default: true

    The documentation... More likely, this is the best place to find the info Permissions FAQ and the wiki
    here's an example
     
  30. Offline

    Aza24

    Superperms support?
    This is not working with my permissions system (AdvPail)
     
  31. Offline

    Gabriel333

    Superperms should work. Have you tried?

    I do not know AdvPail?
     

Share This Page